5

C++ プログラムでメモリを節約しようとしていますが、(Perl のように) 変数のスコープとしてブロックを使用できるかどうかを知りたいです。いくつかの計算を実行して結果を返す巨大なオブジェクトがあるとしましょう。それは理にかなっていますか?

InputType  input;
ResultType result;

{
    // Block of code
    MyHugeObject mho;
    result = mho.superHeavyProcessing();
}

/*
   My other code ...
*/

ブロックを終了するときにオブジェクトが破棄されることを期待できますか?

4

4 に答える 4

25

はい、できます。

デストラクタは、変数がスコープ外になるとすぐに呼び出され、ヒープに割り当てられたメモリを解放する必要があります。

于 2009-02-24T09:36:13.353 に答える
18

はい、もちろんです。メモリの節約に加えて、スコープの終了時にデストラクタを呼び出すことは、デストラクタが呼び出されたときにデストラクタに実際に何かをさせたい場合によく使用されます (RAII を参照)。たとえば、スコープ ベースのロックを作成し、例外的に安全な方法で簡単に解放したり、共有または貴重なリソース (ファイル ハンドル/データベース接続など) へのアクセスを確定的に解放したりします。

-リック

于 2009-02-24T09:41:13.887 に答える
3

デストラクタで解放された new/malloc を使用してヒープに割り当てたメモリは、おそらく OS に解放されないことに注意してください。プロセスがそれを保持している可能性があり、OS はプロセスが終了するまでそれを取得しません。

于 2009-02-24T10:49:17.967 に答える
2

はい。閉じ中括弧で破棄されます。ただし、スタックに非常に大きなオブジェクトを割り当てないように注意してください。これにより、スタック オーバーフローが発生する可能性があります。オブジェクトも大量のメモリを割り当てる場合は、new、malloc、または同様のものでヒープが割り当てられていることを確認してください。

于 2009-02-24T16:32:32.040 に答える