gpt4 book ai didi

c# - 如何在 C# 中释放在 C++ 中分配的内存

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:58 28 4
gpt4 key购买 nike

我有一个 C++ dll,它正在从相机读取视频帧。这些帧在通过指向调用者(C# 程序)的指针返回的 DLL 中分配。

当 C# 处理完特定的视频帧后,需要对其进行清理。 DLL 接口(interface)和内存管理封装在 C# 中的一次性类中,因此更容易控制。但是,似乎内存没有被释放/释放。我的进程的内存占用越来越大,不到一分钟,我在 C++ DLL 中遇到分配错误,因为没有任何内存剩余。

每个视频帧都超过 9 MB。代码很多,所以我将简单地提供分配/解除分配/类型/等。

首先:在 C++ 中为相机字节分配原始缓冲区。

dst = new unsigned char[mFrameLengthInBytes];

第二:从原始指针传输回作为 unsigned char * 的 DLL 边界并传输到 C# 中的 IntPtr

IntPtr pFrame = VideoSource_GetFrame(mCamera, ImageFormat.BAYER);
return new VideoFrame(pFrame, .... );

现在 IntPtr 被传递到 VideoFrame 类的 CTOR 中。在 CTOR 内部,IntPtr 被复制到类的内部成员,如下所示:

IntPtr dataPtr;
public VideoFrame(IntPtr pDataToCopy, ...)
{
...
this.dataPtr = pDataToCopy;
}

我的理解是这是一个浅拷贝,类现在引用原始数据缓冲区。框架被使用/处理/等。后来处理了VideoFrame类,下面用来清理内存。

Marshal.FreeHGlobal(this.dataPtr);

我怀疑问题在于... dataPtr 是一个 IntPtr 而 C# 无法知道底层缓冲区实际上是 9 MB,对吧?有没有办法告诉它此时要释放多少内存?我是否使用了错误的 C# 免费方法?有专门针对这种情况的吗?

最佳答案

您需要在您正在使用的库中调用相应的“免费”方法。

通过 new 分配的内存是 C++ 运行时的一部分,调用 FreeHGlobal 将不起作用。您需要对内存调用(一种或另一种方式)delete[]

如果这是您自己的库,则创建一个删除内存的函数(例如 VideoSource_FreeFrame)。例如:

void VideoSource_FreeFrame(unsigned char *buffer)
{
delete[] buffer;
}

然后从 C# 调用它,传入您返回的 IntPtr

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

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