在做我的編程任務時,我似乎在絆倒基本的C++概念。我在程序中發現了這個錯誤,它是由我的析構函數運行的次數超出了我的預期。這是一個代碼示例,演示我做錯了什麼,直到最基本的東西。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);
堆棧名爲foo
的A
對象的空間分配和調用構造函數,傳遞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.
是什麼原因造成額外的破壞?
也製作嘈雜的複製構造函數。 –
查看[Rule of Three](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree) – rlduffy
[爲什麼該類的析構函數被調用兩次?] (HTTP://計算器。com/questions/2627540 /爲什麼是這個類的析構函數 - 兩次) –