8

Java のバックグラウンドを持つ私は、C++ でのメモリの割り当てについてまだ少し混乱しています。最初の 2 つのステートメントは正しいと確信しています。

void method() {
    Foo foo;    // allocates foo on the stack, and the memory is freed
                // when the method exits
}

void method2() {
    Foo *foo = new Foo();   // allocates foo on the heap
    delete foo;             // frees the memory used by foo
}

しかし、このようなものはどうですか?

void method3() {
    Foo foo = *new Foo();   // allocates foo on the heap, and then copies it to the stack?
                            // when the method exits, the stack memory is freed, but the heap memory isn't?
}

foo内のグローバル配列に追加したとしmethod3()ます。fooメソッドの終了後に のデータ メンバーの1 つにアクセスしようとすると、うまくいきますか? またmethod3()、メモリリークが発生しやすいですか?

前もって感謝します。

4

1 に答える 1

8
Foo foo(); 

fooオブジェクトを返し、Foo引数を取らない名前で関数を宣言します。これは、C++ で最も厄介な解析として知られています。あなたはおそらく次のことを意味していました:

Foo foo; 

fooオブジェクトをローカル/自動ストレージに作成します。{ }宣言されているスコープが終了すると、オブジェクトは自動的に割り当て解除されます。


Foo *foo = new Foo();   // allocates foo on the heap
delete foo;

これは本当です。 が指す freestore のオブジェクトは、fooを呼び出すと割り当てが解除されますdelete。メモリリークはありません。


 Foo foo = *new Foo(); 

Foofreestore にオブジェクトを割り当て、そのオブジェクトのコピーを使用して初期化しますfoo。フリーストアに割り当てられたオブジェクトへのポインタがないため、メモリ リークが発生します。のデストラクタにFoo副作用を引き起こすコードがある場合、それは単なるメモリ リークではなく、未定義の動作であることに注意してください。

于 2013-02-24T07:14:53.877 に答える