2009-02-24 7 views
5

私はC++プログラムでメモリを節約しようとしており、(Perlのように)変数のスコープとしてブロックを使用できるかどうかを知りたいと思います。ブロックを終了するときブロックを使用してC++で変数の範囲を管理できますか?

InputType input; 
ResultType result; 

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

/* 
    My other code ... 
*/ 

は、私は、オブジェクトが破壊されることを期待することができます:のは、私はいくつかの計算を実行し、結果を与える巨大なオブジェクトは、それを行うことは理にかなっていないとしましょうか?

答えて

25

はい、できます。

変数がスコープから外れるとデストラクタが呼び出され、ヒープ割り当てメモリが解放されます。

+0

厳密に言えば、デストラクターを呼び出すことは、オブジェクトの格納に使用されるメモリーを解放することと同じではありません。 – Constantin

+0

質問に* huge *の単語があると仮定することは安全です。オブジェクトがヒープ上に大きなメモリのチャンクを割り当てて解放することを意味します(例:ベクトル)。 –

+0

申し訳ありませんが、明示的なmallocが行われていない限り、MyHugeObjectがスタックに割り当てられ、ヒープには割り当てられないと思われます。私が間違っているなら、私を修正してください。 – 0fnt

18

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

-Rick

+0

スコープベースのロッキングへの参照は、非常に素晴らしいコンセプトです。 – mghie

3

ちょうどあなたがおそらくデストラクタで解放される新しい/ mallocを使用してヒープ上に割り当てる任意のメモリが戻ってOSに解放されないことを覚えておいてください。あなたのプロセスはそれを保持し、OSはプロセスが終了するまでそれを戻さないでしょう。

+0

この場合、メモリはスタック上にありますが、OSはすでにプログラムにコミットしている可能性があります。 (しかし、これは驚くべきことですが、驚くことではありません!) –

+0

True - 私の前提は、オブジェクト自体がスタック上にあってもオブジェクトの巨大オブジェクトが内部的に動的にメモリを割り当てていなければならないということでした。 – Jackson

+0

これは本当に正確ではありません。メモリの大きな部分はまだアプリケーションに割り当てられますが、未使用になった場合は、物理メモリからページアウトされ、パフォーマンスが低下することはありません。いくつかのオペレーティングシステム(ウィンドウ)は、未使用のページアウトメモリをやや弱めに管理していますが、実際にはメモリマップファイルを使用してそのマッピングを解除すると、そのアドレススペースに対して別のページファイルが作成されるため、 – SingleNegationElimination

2

はい。閉じ中括弧で破壊されます。しかし、非常に大きなオブジェクトをスタックに割り当てることには注意してください。スタックオーバーフローが発生する可能性があります。オブジェクトを大量に割り当てる場合は、新しい、mallocなどで割り当てたヒープであることを確認してください。

+0

オブジェクトはヒープ割り当てメモリを実際に指しますが、できるだけ早く解放したいと思います。 – tunnuz

関連する問題