2010-07-27 145 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