2011-08-17 136 views
8

我正在閱讀以下MSKB示例,它們在受管理的對象上執行刪除操作。什麼時候應該刪除被調用的gcnew分配的對象?

我的印象是,你永遠不應該刪除垃圾收集對象,而是你必須把它留給垃圾收集器。

我錯過了什麼?

方法4

//#include <msclr/marshal.h> 
//using namespace msclr::interop; 
marshal_context^context = gcnew marshal_context(); 
const char* str4 = context->marshal_as<const char*>(str); 
puts(str4); 
delete context; 

回答

11

在C++/CLI delete僅僅調用託管對象上Dispose方法中,如果它實現了System::IDisposable接口–如果沒有,這是有效地一個空操作。實際上,如果您嘗試自己調用管理對象上的Dispose方法,您將收到編譯器錯誤– delete是處理對象的強制方式。

要清楚的是,它與內存管理無關,當然注意到大多數可終結的對象如果被丟棄,它們將會更快地被更新。

+0

因此,其他標記爲更直接GC的對象,在上面的例子中沒有什麼好的理由使用刪除? – TownCube

+2

@Cube:不,實現你的'IDisposable'合同的結尾是一個很好的理由**總是**在你完成一個對象時使用'delete'。或者更好的是,爲模擬RAII使用堆棧語義,所以你不必使用'delete',只要對象超出範圍,就會自動調用Dispose。 – ildjarn

相關問題