Skip to main content
 首页 » 编程设计

c#之如果 Bitmap 从 Marshal.AllocHGlobal 获取原始数据,内存泄漏

2024年02月23日37mate10pro

我不清楚 native 互操作的机制。

假设我执行以下操作:

IntPtr nativeArray = Marshal.AllocHGlobal(stride * height); 
someNativeCallToFillRawImageData(nativeArray, width, stride, height); 
return new Bitmap(width, height, stride, PixelFormat.Format24bppRgb, nativeArray); 

我分配的数组就是位图的来源(它有效),但我不确定它的内存是否会被清除?

或者,我可以执行以下操作(通过更改 DLLImport 签名... native 方法最初定义为 (unsigned char *buff)):

byte[] managedArray = new byte[stride * height]; 
someNativeCallToFillRawImageData(managedArray, width, stride, height); 
fixed (byte* ptr = managedArray) 
{ 
   return new Bitmap(width, height, stride, PixelFormat.Format24bppRgb, new IntPtr(ptr)); 
} 

这也有效,但我不清楚到底有什么区别。我也觉得第一个变体更快,因为它不必跨越托管/非托管边界。

托管 Bitmap 对象是否处理 Scan0 中的数据,即使它是由其他人分配的? bitmap.Dispose() -> 在 managedArray 或 nativeArray 中分配的内存会发生什么情况?

非常感谢您!

请您参考如下方法:

如果使用 Marshal.AllocHGlobal 并且位图从指针复制数据,您应该使用 Marshal.FreeHGlobal 释放它。 我建议您阅读有关 BitMap 构造函数的 MSDN,了解它是复制数据还是仅使用指针;如果它只使用指针,则必须等待释放它。