gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:29 27 4
gpt4 key购买 nike

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

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