我有一个C++动态链接库,它从摄像机读取视频帧。这些帧在通过指向调用方( C#程序)的指针返回的DLL中得到分配。
当C#使用特定的视频帧完成时,它需要清理它。DLL接口和内存管理封装在C#中的一次性类中,因此更易于控制。但是,内存似乎没有被释放/释放。我的进程的内存占用不断增长,在不到一分钟的时间内,我就会在C++ DLL中得到分配错误,因为没有任何内存了。
每个视频帧都超过9MB。代码很多,所以我将简单地提供分配/释放位置/类型/等等。
首先:在C++中为摄像机字节分配原始缓冲区。
dst = new unsigned char[mFrameLengthInBytes];
第二:将原始指针作为无符号字符*从原始指针返回到跨DLL边界,并在C#中转换为C#中的
IntPtr pFrame = VideoSource_GetFrame(mCamera, ImageFormat.BAYER); return new VideoFrame(pFrame, .... );
现在,IntPtr被传递到VideoFrame类的CTOR中。在CTOR内部,IntPtr被复制到类的内部成员,如下所示:
IntPtr dataPtr; public VideoFrame(IntPtr pDataToCopy, ...)