0

new演算子を使用して、メソッドで次のようなオブジェクトを作成すると:

void functionA(){
    ClassA *a = new ClassA();
}

解放するには、次のコードを使用する必要がありますか?

   delete a;

c++はClassAオブジェクトのメモリを自動解放できますか? functionA スコープを使い果たしたとき。

このようなコードを書くと

void functionA(){
    ClassA a = ClassA();
}

は自動的にリリースされますか?

4

5 に答える 5

5

為に:

void functionA() {
    ClassA *a = new ClassA();
}

delete a;クリーンアップするには、関数内に配置する必要があります。

void functionA() {
    ClassA *a = new ClassA();
    // your other code here
    delete a;
}

そうしないと、メモリ リークが発生します。aこれは、何らかの方法で変数を返すか、それを解放する別の場所に渡さない限りです。

為に:

void functionA(){
    ClassA a = ClassA();
}

aデストラクタを適切に定義すると、自動的に「解放」されます。デストラクタaで適切にクリーンアップしないと、フィールド内の一部がリークする可能性があります。ClassA

于 2013-06-06T05:14:22.000 に答える
3
void functionA(){
    ClassA a = ClassA();
}

うーん、なぜそれを書くのですか?それは非効率的で、紛らわしく、完全に不必要です。どうしたの:

void functionA() {
    ClassA a;
}

一般的に言えば、 を使用する場合は、 で割り当てたインスタンスが不要になったときに使用newする必要があります。もちろん例外もありますが、今は気にする必要はありません。今のところ覚えておいてください: 割り当てた場合、 でそれを所有し、 で割り当てを解除する必要があります。deletenewnewdelete

于 2013-06-06T05:19:12.893 に答える
3

解放するには、次のコードを使用する必要がありますか?

はい、すべてのnewed オブジェクトを解放する必要があります。

c++はClassAオブジェクトのメモリを自動解放できますか?

スマートポインターを使用できます:

#include <memory>

void functionA(){
    std::unique_ptr<ClassA> a_ptr(new ClassA);
}

割り当てられたメモリは、範囲外にa_ptrなると自動的に解放されます。a_ptr

このようなコードを書くと

void functionA(){
    ClassA a = ClassA();
}

は自動的にリリースされますか?

はい、そうです。

于 2013-06-06T05:17:23.330 に答える
1

はい、動的に割り当てられた生ポインタを削除する必要があります。範囲外に出たときに自動的に破棄したい場合は、ブースト ライブラリの [ shared_ptr][1] または [ unique_ptr][2] または [ ][3] のような C++11 標準に含まれるスマートポインターを使用できます。scoped_ptr

 [1]: http://www.cplusplus.com/reference/memory/unique_ptr/
 [2]: http://www.cplusplus.com/reference/memory/shared_ptr/
 [3]: http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/scoped_ptr.htm
于 2013-06-06T05:17:57.733 に答える
1

std::unique_ptrこれを自動的に行うために使用できます。

void functionA() {
    std::unique_ptr<ClassA> a(new ClassA());
    // don't release
}
于 2013-06-06T05:17:47.777 に答える