gpt4 book ai didi

c# - 从 c++ DLL 和 c# 中释放 SAFEARRAY

转载 作者:IT王子 更新时间:2023-10-28 23:34:35 25 4
gpt4 key购买 nike

我有一个获取数据的 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);
}

但我遇到了一个异常(exception):

An unhandled exception of type 'System.AccessViolationException' occurred in Tester.exe

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

怎么了?

最佳答案

我觉得你应该试试:

...
SafeArrayDestroy(*psa);
*psa = NULL
...

原因是您将 strServerList 声明为 out,因此 .Net 编码器将尝试将指向无效(已释放)内存的指针转换为字符串数组,可能会引发异常。

关于c# - 从 c++ DLL 和 c# 中释放 SAFEARRAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6719376/

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