2

この質問と並行して: C++ で new キーワードを使用する必要があるのはいつですか?

次のコード構造があるとします。

class Foo{
private:
    int a;
    int b;
    /* ect */
};

class Bar{
private:
    Foo A;
    /* ect */
};

int main() {
    Bar *b;
    b = new Bar();

    // call b->methods()

    delete b;
};

b上記のリンクから、ヒープ (空きストア) が割り当てられていることがわかります。Aしかし、内部クラスの内容はbどうですか? Aヒープも割り当てられ ていると想定しても安全ですか?

4

1 に答える 1

8

「山の上」というのは、衒学的に言えば、ちょっとした誤称です。C++ はヒープの使用を指示しません。使用して割り当てられたオブジェクトがnew未指定の「フリー ストア」に割り当てられるだけです。ともかく...

はい、Bタイプのメンバー変数があり、 usingAをインスタンス化する場合、そのオブジェクトはすべてフリーストアにあります。Bnew

ただし、次の場合に注意することが重要です。

B* b = new B;

b それ自体はフリーストアではなく、自動変数 (つまり、「スタック上」) です。指し示しているbのはフリーストアにあります。自動変数は、スコープ外に出ると破棄されますがb、この場合に指すものはそうではありません。そうしないdelete b;と、メモリ リークが発生します。

これは紛らわしく、重要ではないように見えるかもしれません。紛らわしいかもしれませんが、重要ではありません。bフリーストア上の何かを指す自動変数であるという事実は、RAII として知られる非常に重要なイディオムを可能にします。これは、スマート ポインターなどに使用されます。

shared_ptr<B> b(new B);

b、ここでは、まだ自動変数です。しかしb、範囲外に出て破壊されると、それはb指し示すものを一緒に持っていきます。ここでスマート ポインターを使用すると、上記を行わなかった場合に発生するメモリ リークを解消するのに役立ちますdelete b

于 2012-10-19T22:35:20.827 に答える