2010-07-27 182 views
2

我正在处理自定义调试引擎,当我将我的结构编组为IntPtr Visual Studio崩溃(被调试的不是调试器)。Marshal.StructureToPtr崩溃Visual Studio

我的结构是多一点:

public struct DocumentContext : IDebugDocumentContext2, IDebugCodeContext2 
{ 
    private string _fileName; 

    //.....Implementation of interfaces 
} 

我的编组代码如下所示:

 var documentContext = new DocumentContext(_node.FileName); 
     var size = Marshal.SizeOf(documentContext); 
     IntPtr ptrDocContext = Marshal.AllocHGlobal(size); 
     //This is what is crashing 
     //I don't have a chance to catch anything, it just craps out 
     //Event log says faulting dll is nt.dll 
     Marshal.StructureToPtr(documentContext, ptrDocContext, true); 

我缺少的东西?

回答

5

如果非托管结构以前从未分配过,则不应使用deleteOld。 deleteOld当你覆盖现有的结构只适用这应该工作(从而解除分配字符串的引用,例如。):

Marshal.StructureToPtr(documentContext, ptrDocContext, false); 
+0

唉唉奏效。谢谢。我对那面旗帜有些模糊。 – 2010-07-27 00:53:13

+1

文档中的免责声明有点微妙。它清楚地指出,如果你传递false,你可能会泄漏内存,但只有进一步下去才能澄清,如果结构不包含有效数据,那么传递true将失败。从本质上讲,它试图释放结构中字符串引用指向的内存,但指针无效,并且会崩溃。 – 2010-07-27 01:02:15