相关文章推荐
踏实的柳树  ·  [Solved] Asynchronous ...·  4 月前    · 
温柔的椰子  ·  android ...·  1 年前    · 

在使用 Marshal.AllocHGlobal()申请了非托管的内存时,需要手动释放内存,否则会造成内存泄漏;可以使用 Marshal.FreeHGlobal()将申请的内存释放掉。

代码如下:

IntPtr pBGRbuffer = Marshal.AllocHGlobal((int)frame.frameInfo.size * 3);
 Marshal.FreeHGlobal(pBGRbuffer);
 pBGRbuffer = IntPtr.Zero;
                                    C# Marshal.AllocHGlobalMarshal.StringToHGlobalAnsi 与Marshal.FreeHGlobal的区别
                                    在将彩色Bitmap转为Halcon的HObject,需要用指针读取图像数据,而byte*需要运行在unsafe代码块中,此Marshal.AllocHGlobal()分配内存后,需要手动释放,否则会造成内存泄漏,释放函数为:
Marshal.FreeHGlobal()
# [内存] 是由 [Key] 和 [Value] 组成的:
[Key] 是 [内存地址];(在 C# 程序中用 [IntPtr] 类型表示)
[Value] 是 [内存数据];(在 C# 程序中用 [byte] 类型表示)
[Key] 是一个固定32位长度的二进制数;(64位的程序则是64位长度的二进制数)
[Value] 是一个固定8位长度的二进制数;(这就是计算机只能存储 0 和 1,并且最小存储单位为 byte 的原因)
                                    C#——Marshal.StructureToPtr方法简介
http://blog.csdn.net/livelylittlefish/article/details/2423764
                                    Marshal类
提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互使用的其他杂项方法。
命名空间:System.Runtime.InteropServices
Marshal 类中定义的 static 方法对于处理非托管代码至关重要。此类中定义的大多数方法通常由需要在托管和非托管编程模型之间提供桥梁的开发人员使...
                                    这次偶发的生产崩溃事故,主要原因是朋友的代码在逻辑上出了点问题,没有合理的保护好句柄资源,反复释放导致的 ntheap 破坏。这个 dump 虽然问题比较小白,但逆向分析找出原因,还是挺考验基本功的。
                                    否则,调用者就看不见被调用者修改的内容。2.1、System命名空间下的Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Single、Double类型为blittable基元类型。8.4、当String以LPStr、AnsiBStr、BStr、TBStr、LPUTF8Str非托管类型按照引用传递,互操作封送器在非托管代码调用返回会将辅助缓冲区中的内容复制回托管代码中的一个新String中。