none
C# Marshal.FreeHGlobal() 爆异常:堆已损坏 RRS feed

  • 问题

  •         public static byte[] StructToBytes(object structObj)
            {
                int size = Marshal.SizeOf<object>(structObj);
                byte[] bytes = new byte[size];
                IntPtr buffer = Marshal.AllocHGlobal(size);

                try
                {
                    Marshal.StructureToPtr<object>(structObj, buffer, false);
                    Marshal.Copy(buffer, bytes, 0, size);
                }
                catch(OutOfMemoryException ex)
                {
                    MsgNotification.PopErrorInfo("StructToBytes error:" + ex.Message);
                }
                catch(ArgumentNullException ex)
                {
                    MsgNotification.PopErrorInfo("StructToBytes error:" + ex.Message);
                }
                finally
                {
                    Marshal.FreeHGlobal(buffer);
                }

                return bytes;
            }

    UWP开发使用C#语言 上面的函数跑在Debug模式下非常稳定, 百测不爆

    然而切换到Release模式下之后调用即爆.. 

    0x76FE9AAA (ntdll.dll) (hkEncrypt.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏。 (参数: 0x770258E8)。

    同样的函数为什么在Debug模式下没问题到了Release之后就无法正常使用了呢?

    这个问题该如何解决呢?

    2017年8月26日 2:46

答案

  • 通常0x76FE9AAA (ntdll.dll)汞种讯息的出现,都跟系统档案损毁有很大的关系,在debug模式下,它依附的是在VS底下的的环境,在底层的运作有点不同。0x76FE9AAA (ntdll.dll)的讯息有几种可能:1.系统档案捐毁。2.硬碟出现异常。建议可以先行修复系统中的一些错误。或者尝试把你编译过的程式,用一台正常运作的电脑执行看看。
    • 已标记为答案 花開灬 2017年9月2日 0:46
    2017年8月26日 6:27

全部回复

  • 通常0x76FE9AAA (ntdll.dll)汞种讯息的出现,都跟系统档案损毁有很大的关系,在debug模式下,它依附的是在VS底下的的环境,在底层的运作有点不同。0x76FE9AAA (ntdll.dll)的讯息有几种可能:1.系统档案捐毁。2.硬碟出现异常。建议可以先行修复系统中的一些错误。或者尝试把你编译过的程式,用一台正常运作的电脑执行看看。
    • 已标记为答案 花開灬 2017年9月2日 0:46
    2017年8月26日 6:27
  • 换掉了Marshal

    但是你的答案说的还是有一些道理的

    2017年9月2日 0:47