2011-08-17 21 views
8

私は以下のMSKBの例を読んでいて、管理対象オブジェクトに対して削除を実行します。gcnewに割り当てられたオブジェクトでは、いつ削除する必要がありますか?

ガベージコレクションされたオブジェクトを削除しないでください。ガベージコレクタに残す必要があります。

私は何が欠けていますか? C++/CLIで

方法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

deleteそれは、それが効果的にNOOPだしない場合、それはSystem::IDisposableインタフェース–を実装している場合だけで、管理対象オブジェクトでDisposeメソッドを呼び出します。実際に、管理対象オブジェクトのDisposeメソッドを自分で呼び出そうとすると、コンパイルエラー– deleteがオブジェクトを処分するための強制的なイディオムになります。

明らかに、メモリ管理とは関係なく、ほとんどのファイナライズ可能オブジェクトは、処分されるとすぐにGCedされることに注意してください。

+0

他の場合は、より即時のGCのためにオブジェクトをマークしても、上記の例でdeleteを使用する理由はありませんか? – TownCube

+2

@Cube:いいえ、 'IDisposable'契約の終わりを徹底的に守ることは、いつでも**オブジェクトを終えたときに' delete'を使う素晴らしい理由です。または、より良いのは、シミュレートされたRAIIのスタックセマンティクスを使用して、 'delete'を使用する必要がないようにします。オブジェクトがスコープから外れるとすぐに' Dispose'が自動的に呼び出されます。 – ildjarn

関連する問題