gpt4 book ai didi

c# - 互操作 C++ 时释放分配的内存

转载 作者:搜寻专家 更新时间:2023-10-31 00:59:26 24 4
gpt4 key购买 nike

填充一个包含字符串的 stuct 数组,我已经测试并发现在 c# 中它通过指针执行得更快:

struct name{
int intv;
IntPtr strv;
}

当通过 GetPacksPtr() 实现时:(见下面的代码/签名)这就是我的编码方式,但不确定我是否做对了......

假设 ArrL=10,000

        DataPack* DataPackArr;
List<DataPack> DataPackLst = new List<DataPack>(ArrL);
GetPacksPtr(ArrL, &DataPackArr);

DataPack* CurrentPack = DataPackArr;
for (int i = 0; i < ArrL; i++, CurrentPack++)
{
DataPackLst.Add(new DataPack() { strv = CurrentPack->strv, intv = CurrentPack->intv });
}

我在哪里可以释放分配的内存,因为__stdcall 定义非托管代码必须释放内存,但谁是所有者“通过契约(Contract)”...这令人困惑,我试图负责释放分配以最小的性能影响.

C++

extern "C" __declspec(dllexport) void __stdcall GetPacksPtr(int size, DataPack** DpArrPtr )
{

*DpArrPtr = (DataPack*)CoTaskMemAlloc( size * sizeof( DataPack ));
DataPack CurPackPtr = *DpArrPtr;
char aStr[]= "abcdefgHi";
for ( int i = 0; i < size; i++,CurPackPtr++ )
{

CurPackPtr->IntVal=i;
CurPackPtr->buffer = (char*)malloc(sizeof(aStr));
strcpy(CurPackPtr->buffer, aStr);
}


}

c#

    [DllImport("exported.dll", CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurity]
public static extern void GetPacksPtr(int RaySize, DataPack** DataPackArr);

最佳答案

是的,这在您手动分配内存时很常见,当然速度更快,您需要另一个(这部分我不知道该说什么,因为您混合了所有内容)像这样的功能

__declspec(dllexport) void __stdcall FreePacksPtr(int size, DataPack *DpArrPtr)
{
for (size_t i = 0 ; i < size ; ++i)
free(DpArrPtr[i].buffer);
CoTaskMemFree(DpArrPtr);
}

然后在您的 C# 中,只要您不再需要指针,就调用 FreePacksPtr()

注意:您需要 extern "C" 的事实意味着 C# 代码期望从 dll 加载准确的符号,看来您必须指示 Microsoft 编译器编译 C 代码而不是 C++,我不是 100% 确定,但 Microsoft 编译器混合了这些。

关于c# - 互操作 C++ 时释放分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33339317/

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