我不清楚 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/