8

C++ で動的に割り当てられたオブジェクトを使用する場合:

TGraph* A = new TGraph(...);

deleteそうしないと、制御が親スコープに戻されたときにオブジェクトがまだメモリ内にある可能性があるため、常にこれらを使用する必要があります。これがプログラムのサブスコープとサブルーチンに当てはまる理由はわかりますが、同じことがmainスコープにも当てはまりますか?

delete内部で動的に構築されたオブジェクトを使用する義務がありますmain()か? これが少し冗長に思える理由はmain、プログラムが終了するとプログラムも終了するため、メモリ リークを心配する必要がないからです。

4

7 に答える 7

13

最新の OS のほとんどは、プログラム (プロセス) に割り当てたすべてのメモリを常に回収します。
OSは、プログラムがメモリをリークしたかどうかを実際には理解していません。割り当てられたものを取り戻すだけです。

しかし、メモリの損失だけでなく、より大きな問題が手元にあります。

呼び出す必要のあるオブジェクトのデストラクタがdelete重要な操作を実行し、プログラムがそれによって生成される副作用に依存している場合、プログラムは未定義の動作[参照 1]の餌食になることに注意してください。それが発生すると、すべての賭けがオフになり、プログラムが何らかの動作を示す可能性があります。

また、OS は通常、割り当てられたメモリを再利用しますが、他のリソースは再利用しないため、これらのリソースを間接的にリークする可能性があります。これには、ファイル記述子やプログラム自体の状態などを扱う操作が含まれる場合があります。

deleteしたがって、プログラムを呼び出すかdelete []終了する前に 、すべての割り当てを常に解放することをお勧めします。


[参照 1] C++03 標準 3.8 パラ 4:

「....デストラクタへの明示的な呼び出しがない場合、またはストレージを解放するために削除式 (5.3.5) が使用されていない場合、デストラクタは暗黙的に呼び出されず、副作用に依存するプログラムが生成されます。デストラクタによる動作は未定義です。」

于 2012-04-23T09:23:55.753 に答える
7

deleteIMO常に適切に呼び出すことが最善です:

  • 自動的に習慣化し、本当に必要なときに忘れにくくする
  • 非メモリ リソース (ソケット、ファイル ハンドルなど) を解放する必要がある場合に対応するため - これらは OS によって自動的に解放されません。
  • main問題のコードが範囲外に移動される可能性がある場合に、将来のリファクタリングに対応するため
于 2012-04-23T09:25:17.937 に答える
3

deleteはい、少なくともベスト プラクティスであるため、 に電話する必要があります。デストラクタに重要なロジックがある場合、それが を呼び出す必要があるもう 1 つの理由ですdelete

修正: プログラムがデストラクタのロジックに依存している場合、delete明示的に呼び出さないと、未定義の動作が発生します。

于 2012-04-23T09:23:01.087 に答える
0

これが私には少し冗長に思える理由は、メインが終了するとプログラムも終了するため、メモリリークを心配する必要がないためです。

その通りですが、これを考慮してください。リモートDBへの接続を開くクラスオブジェクトを作成します。プログラムが完了したら、DBに「完了しました。切断します」と伝える必要がありますが、deleteを正しく呼び出さない場合は発生しません。

于 2012-04-23T09:32:57.417 に答える
0

ROOT を使用しているようです (CMS の人ですか?)。ROOTはこれを処理してクリーンアップすると思いますね。

于 2012-04-23T09:50:31.130 に答える
0

ベストプラクティス:

  1. を使用せずnew、自動割り当てを使用する
  2. 動的割り当てが必要な場合は、RAII を使用して自動クリーンアップを保証します

deleteアプリケーション コードを記述する必要はありません。

ここで、なぜあなたは を呼んnewでいるのTGraphですか?

TGraph A(...);

うまく機能します: 心配が減ります!

于 2012-04-23T11:14:19.177 に答える
0

割り当てられているメモリの割り当てを解除するのがベスト プラクティスです。ヒープメモリは制限されており、プログラムの実行中に割り当てを解除せずに割り当てるだけで、他の/または同じプログラムのためにヒープスペースが使い果たされる可能性があることに注意してください(実行することを意図したある種のデーモンの場合)非常に長い間) ヒープが必要です。

もちろん、メモリはプログラムの実行の最後にオペレーティング システムによって再利用されます。

于 2012-04-23T09:35:57.103 に答える