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

标签 c# bitmap pinvoke marshalling

我不清楚 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,了解它是复制数据还是仅使用指针;如果它只使用指针,则必须等待释放它。

关于c# - 如果 Bitmap 从 Marshal.AllocHGlobal 获取原始数据,内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4531922/

相关文章:

c# - 在远程计算机上使用与 Excel 的互操作

c# - 格式化一个大的 double 以显示四位有效数字

c# - 单击 1 次后禁用按钮

java - 调用 Bitmap.compress 不返回 - 并且没有异常

javascript - “system.Action”不是有效的 Windows 运行时参数类型

c - fwrite 失败取决于先前的 fwrite

c++ - HBITMAP 内存泄漏

c# - Windows 安全登录表单?

.net - 如何从流中加载非托管 DLL?

c# - 在实例类中包装静态非托管库