プログラミングの割り当てをしている間、私は基本的なC++の概念に出くわしているようです。プログラムにバグが見つかりました。これは、デストラクタが予想よりも多く実行されたことが原因でした。これは、私が間違っていることを示すコードサンプルです。
#include <iostream>
using namespace std;
class A
{
public:
A(int num)
{
number = num;
cout << "A constructed with number " << number << ".\n";
}
~A()
{
cout << "A destructed with number " << number << ".\n";
}
private:
int number;
};
class B
{
public:
B(A pa)
: a(pa)
{
cout << "B constructor run.\n";
}
~B()
{
cout << "B destructor run.\n";
}
private:
A a;
};
int main()
{
A foo(7);
{
B bar(foo);
}
//Pause the program.
system("pause");
}
私が期待してA foo(7);
いるのは、スタック上のスペースをA
という名前のオブジェクトに割り当てfoo
、コンストラクターを呼び出して、を渡すこと7
です。コンストラクターが実行されたことを示す出力を割り当て7
てnumber
出力します。ここで、名前の付いたオブジェクトB bar(foo);
にスタック上のスペースを割り当て、コンストラクターを呼び出して、値を渡します。これは、の単なるコンテナーです。コンストラクターは、渡されたパラメーターを自身のプライベートデータメンバーに割り当て、出力を画面に出力します。B
bar
foo
int
A
a
さて、bar
閉じ中括弧でスコープから外れると、bar
のデストラクタが呼び出されることを期待します。これにより、出力が画面に出力され、データメンバーのデストラクタが呼び出されますA a
。そのデストラクタは出力を画面に出力し、int number
含まれていたものを破棄します。
私が期待する出力は次のとおりです。
A constructed with number 7.
B constructor run.
B destructor run.
A destructed with number 7.
//Destructors should be called in the reverse order of their construction right?
実際の出力:
A constructed with number 7.
B constructor run.
A destructed with number 7. //This is unexpected.
B destructor run.
A destructed with number 7.
その余分な破壊を引き起こしているのは何ですか?