1

C++ でヒープからオブジェクトを削除するタイミングと方法が少しわかりません。

いつ:

比較的短いプログラムを実行し、何かを計算してから標準出力をコンソールに渡す場合、コンソールが結果を出力した直後にすべてのオブジェクトを破棄する価値がありますか、それとも終了時にプログラムが自動的に破棄しますか? 大規模なプログラムの場合、オブジェクトが不要になったときに試して解決する方が間違いなく良い方法だと思いますか?

どのように:

MyClass オブジェクトへのポインターを含むベクターがある場合、ベクター (および MyClass オブジェクト) の処理が完了したら、ベクターが指すすべての MyClass オブジェクトを破棄できるデストラクタを作成するにはどうすればよいですか? (明らかに、ベクターも破棄する必要があります)。

4

4 に答える 4

5

これは非常に単純なコントラクトです。すべてのプログラミングの中で最も単純なものの 1 つです。リソースを割り当てる場合、適切に解放することを API に約束します。

そうしない、悪影響が生じます。ヒープスペースの浪費から、内臓を噛む鼻の悪魔まで。

実際には、要求したリソースを解放しない言い訳はありません。そうしないのはずさんであり、一般的にコードの品質が悪いことを示していると思います (なぜなら! )。

さらに、C++ を使用すると、この決定を下す必要がなくなります。単純にガベージを生成しないので、クリーンアップする必要がありません。freestore メモリを割り当てないでください。または、絶対に必要な場合は、スマート ポインターまたは特別なアロケーターを使用して管理してください。

C++ を適切に使用すれば、リソースをずさんにする説得力のある技術的な理由はなく、注意を払う十分な動機があります。

「方法」に関しては、そもそもポインターを格納するという決定に疑問があります。生の C++ ポインターはメモリを所有すべきではありません。フリーストア メモリが本当に必要な場合は、スマート ポインタを使用するか、(できれば) 代わりに自動オブジェクトを使用します。それらはベクトル内にあるため、所有権と格納場所が既に与えられており、ベクトル クラスがそのメモリを自動的に処理します。

ポリモーフィック オブジェクトが必要な場合は、残念ながらポインターを格納する必要があります。その場合、いくつかの可能性がありますが、おそらく最も簡単なのはスマート ポインターの使用です。

于 2012-05-27T22:53:36.413 に答える
1

オブジェクトを使い終わったときにオブジェクトを破棄しないと、メモリ/リソース リークが発生します。オブジェクトを見失うと、リークが発生します。

メモリやリソースが不足する可能性があるため、これは実行時間の長いプログラムの問題です。オブジェクトが適切に追跡されていない場合、それはどのプログラムでも悪い兆候です。オブジェクトを作成したのに、なぜそれも破壊できないのですか?

ほとんどの (すべての?) オペレーティング システムは、プロセスが終了すると、プロセスから割り当てられたメモリを再利用するため、自分で後片付けをする必要はありません。場合によっては、この無意味な片付けを避けることで、ユーザーがプロセスの完了を長時間待たなくても済むようになることがあります。

プログラムがこのように動作すると、コードを再利用できなくなります。ライブラリにパッケージ化する場合は、ライブラリがどのように使用されるかを前もって知ることができないため、この問題に対処する必要があります。

ポインターのベクトルについては、ベクトルを反復し、各ポインターで削除を呼び出します。次にベクターを破壊します。

于 2012-05-27T22:31:42.900 に答える
1

ベクトルが指すすべての MyClass オブジェクトを破棄できるデストラクタを作成するにはどうすればよいですか?

とても良い質問です!このようなデストラクタを持つクラスはスマート ポインタと呼ばれ、 Boost、TR1、C++11 標準ライブラリなどのライブラリによって提供されます。これらのライブラリの少なくとも 1 つがプラットフォームに付属している可能性があります。

new T直接使用することはほとんどありません。unique_ptr<T>単純な所有権 (ベクトルがまだ存在する場合にのみオブジェクトが存続する) またはshared_ptr<T>共有所有権に使用します。これらのテンプレートは、取得方法に応じて、ネームスペースboost::std::tr1::、またはに存在します。std::いずれの場合も、インターフェイスはほとんど同じです。

もちろん、回避できるのであれば、いかなる種類のポインタも使用すべきではありません。どの日vector<T>よりも好ましいです。vector< unique_ptr< T > >

終了する前にリソースを解放するかどうかについては、もちろんそうすべきです。C++ の優れたプラクティスでは、リソースを解放することを怠るほうが、正しく行うよりも難しくなります。

于 2012-05-27T23:10:27.743 に答える
-3

実行時間の短いプログラムの場合、オブジェクトを削除しなくても問題ありません。悪影響はありません。

しかし、適切に設計されたアプリケーション コードは再利用可能であり、再利用可能なコードは基本的にライブラリ コードです。ライブラリ コードは、長時間実行されるプログラムで使用される可能性があるため、割り当てたオブジェクトを削除する必要があります。

つまり、使い捨ての小さなプログラムについては心配する必要はありません。ただし、重大なコードの場合は、オブジェクトをリークするのではなく、オブジェクトを削除してください。

于 2012-05-27T22:28:21.430 に答える