-1

私は問題を抱えており、その原因を知っていると確信しています。説明をお願いします。他のクラスを含むクラスがありますが、簡単にするために例を 2 つのクラスに制限します。

クラス A にはクラス B が含まれています。クラス A のコンストラクターでは、クラス B のコンストラクターを呼び出してクラス B を初期化します。クラス A のコンストラクタの最後に、クラス B のデストラクタが呼び出されますが、これは私が期待していた動作ではありませんでした。ここに例があります...

ああ

#include "b.h"

class a {
    public:
        b classB;

        a(int someParam);
};

a.cpp

#include "a.h"

//Class A's constructor
a::a(int someParam) {
    //Set class B by calling it's constructor
    classB = b(someParam);
    //Now class B's destructor gets called when exiting A's constructor...
}

「new」を使用せずに変数を宣言すると、現在のスコープを離れるときに破棄されることを知っています。しかし、それは変数のスコープに適用され、値を割り当てるスコープには適用されないと常に考えていました。それ問題ですよね?なら、やっclassB = *new b(someParam);てもいいじゃないですか。それとも、代わりにポインターを使用する必要がありますか?

4

1 に答える 1

3

この行で:

classB = b(someParam);

この式b(someParam)は一時的な名前のないbオブジェクトを作成し、メンバー オブジェクトに割り当てますclassB。呼び出されるのは、メンバー オブジェクトのデストラクタではなく、この名前のない一時的なデストラクタです。この一時的な作成を避け、代わりに適切なコンストラクターでメンバー オブジェクトを直接初期化する場合は、初期化リストを使用します。

a::a(int someParam)
    :classB(someParam)
{}

この:

classB = *new b(someParam);

インスタントメモリリークです。フリー ストアにオブジェクトを割り当て、そこから に割り当てをコピーしclassB、ポインターを失います。

于 2013-10-25T05:00:09.700 に答える