何时应该在gcnew分配的对象上调用delete?

Tow*_*ube 9 c++-cli visual-studio-2008

我正在阅读以下MSKB示例,他们在托管对象上执行删除操作.

我的印象是你永远不应该删除一个带有垃圾的收集对象,而你必须把它留给垃圾收集器.

我错过了什么?

方法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;
Run Code Online (Sandbox Code Playgroud)

ild*_*arn 13

delete在C++/CLI中只调用Dispose托管对象上的方法,如果它实现了System::IDisposable接口 - 如果它没有,它实际上是一个noop.实际上,如果您尝试Dispose自己在托管对象上调用该方法,则会出现编译器错误 - delete是处理对象的强制惯用法.

要清楚,它与内存管理无关,当然注意到大多数可终结的对象如果被处理掉的话会更快得到GC.

  • @Cube:不,完全了解你的'IDisposable`合同是一个很好的理由,**当你完成一个对象时,**总是**使用`delete`.或者更好的是,对模拟RAII使用堆栈语义,因此您永远不必使用`delete`,并且只要对象超出范围,就会自动调用`Dispose`. (2认同)