gpt4 book ai didi

c# - System.AccessViolation 由于 Marshal.StructureToPtr

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:17 25 4
gpt4 key购买 nike

我在我的应用程序中使用了第三方工具。在某些系统上,我收到 System.AccessViolation 错误。虽然,通过代码我无法重现该问题。但在生产环境中它有时会重现。

我对下面的代码有疑问

public static IntPtr TestMarshalToPointer(object value, System.Type type, int length)
{
int offset = 0;
int size = Marshal.SizeOf(type) * length;
IntPtr buffer;

try
{
buffer = Marshal.AllocHGlobal(size);

for (var index = 0; index < length; index++)
{
Marshal.StructureToPtr(value, new IntPtr(buffer.ToInt32() + offset), false);
// Its written on MSDN that passing false can lead to memory leak. Please guide , should i need to pass true and how it will affect**
offset += Marshal.SizeOf(type);
}
}
catch
{
buffer = (IntPtr)null;
}

return buffer;
}

最佳答案

不像一些观察那样是一个真正的答案,但是评论太长了,所以:

  1. 如果你想返回一个代表nullIntPtr,使用IntPtr.Zero;这就是它的全部目的。

  2. IntPtr 类有一个 Add 方法,它向现有的 IntPtr 添加一个偏移量,这比你的更安全正在做。

  3. 由于您刚刚分配了全局缓冲区,并且其中还没有托管引用,因此您应该继续将 false 传递给 StructureToPtr;无论如何,它没有什么可以免费的

你能准确地说出这段代码的哪一行产生了访问冲突吗?

关于c# - System.AccessViolation 由于 Marshal.StructureToPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9890338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com