2010-10-22 34 views
1

我有一個C++/CLI(VS 2008)混合模式庫,用於創建本地對象並在那裏調用方法。本機DLL是用純C++編寫的。現在,在我的C++/CLI的包裝方法,如果我宣佈本機類的對象在C++的方式爲什麼我應該在混合模式下使用新的本地對象?

ClassA obj; 
Obj.Method(); 

,並使用它,它的工作原理,但我得到System.AccessViolationException: Attempt to read or write protected memory程序時存在。

但如果我這樣做,這樣

ClassA *obj = new ClassA(); 
Obj->Method(); 

它工作正常。 所以我的問題是爲什麼我不能在棧上聲明一個對象的C++方式?本地代碼中的 Destructor被聲明爲虛擬。這是原因嗎?

回答

1

不,這與stack vs heap無關。託管程序中的堆棧與本機程序中的堆棧沒有區別。在託管程序中使用本機代碼不會導致它破壞堆,壓縮堆棧框架,覆蓋緩衝區的末尾,調用未定義的行爲,這是使本機代碼崩潰的常見原因違反。

將它存儲在堆棧中與堆中的區別在於所做的損害類型。是的,堆腐敗可能需要一段時間纔會產生副作用。通常遠比堆棧幀腐敗更長,包括永遠不會。

0

我的猜測是你的析構函數有一個錯誤。當程序退出時,析構函數在第一種情況下熄滅,但不在第二種情況下。你可以在你的第二個案例碼的地方加入

delete obj; 

,並與調試器步進看到,如果你得到的異常進行測試。然後在你的析構函數中解決這個問題。

+0

我在那個角度嘗試了debugginb,刪除了第二種情況。並調用析構函數創建任何錯誤。我也寫了一個本地樣本來測試它。 – anivas 2010-10-22 11:30:07

相關問題