我有一个C++函数,用于获取数据,并从C#中调用它。该函数获取指向SAFEARRAY的指针,并使用SysAllocString将其填充为字符串。
一切正常,但程序存在内存泄漏问题。
我进行了一些搜索,并发现如果在方法签名中添加此属性:
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
out string[] strServerList
我需要在C++代码中释放它(它是在那里分配的),因此我创建了这个函数。
[DllImport("Native.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "DeallocateExternal")]
internal static extern void DeallocateExternal(
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
out string[] strServerList);
在我的dll中,我编写了以下代码。
void DeallocateExternal(SAFEARRAY** psa)
{
LONG cDims = SafeArrayGetDim(*psa);
BSTR* pvData = (BSTR*)((*psa)->pvData);
for (LONG x = 0; x < cDims; x++)
{
SysFreeString(pvData[x]);
}
SafeArrayDestroy(*psa);
}
但是我遇到了一个异常:
未经处理的类型为 'System.AccessViolationException' 的异常发生在 Tester.exe 中
额外信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
出了什么问题?