Scott Meyers Effective C++ を読んでいて、リソース管理について質問があります。この本の中で、彼は auto_ptr オブジェクトを使用してメモリを管理することを提案しています。これは、オブジェクトがスコープ外になると、オブジェクトが指すオブジェクトのデストラクタを自動的に呼び出すためです。以下に例を示します。
void f() {
Investment *pInv = createInvestment(); // Call factory function
... // use pInv
delete pInv; // release object
}
...
彼は、これは潜在的に問題があると主張しています。これは、メソッドが到達するのを妨げる多くのことが発生する可能性があるためですdelete pInv
(時期尚早の return ステートメント、スローされた例外など)。これは彼が代わりに提案するコードです
void f() {
std::auto_ptr<Investment> pInv(createInvestment()); // call factory function
... // use pInv as before
} // automatically delete pInv
これは、範囲外になると何が起こってpInv
も削除されるため、機能します。
pInv
私の質問は次のとおりです。最初のコード ブロックで範囲外になったときに、デストラクタが呼び出されないのはなぜですか。時期尚早の return ステートメントがオブジェクトをスコープ外に押し出すのではないでしょうか?それとも C++ でのガベージ コレクションのしくみではないでしょうか?
うまくいけば、私は私の混乱を十分に説明しました。前もって感謝します!