考慮這段代碼:拷貝構造
#include <vector>
#include <iostream>
using namespace std;
class Base
{
char _type;
public:
Base(char type):
_type(type)
{}
~Base() {
cout << "Base destructor: " << _type << endl;
}
};
class uncopyable
{
protected:
uncopyable() {}
~uncopyable() {}
private:
uncopyable(const uncopyable&);
const uncopyable& operator=(const uncopyable&);
};
class Child : public Base, private uncopyable
{
int j;
public:
Child():
Base('c')
{}
~Child() {
cout << "Child destructor" << endl;
}
};
int main()
{
vector<Base> v;
Base b('b');
Child c;
v.push_back(b);
v.push_back(c);
return 0;
}
我的系統上的輸出是:
Base destructor: b
Child destructor
Base destructor: c
Base destructor: b
Base destructor: b
Base destructor: c
我的問題是:
爲什麼是
Base
(類型b)的析構函數被調用三次而不是兩次(我們是否有超過兩個對象b的副本)?當我們複製一個類型爲
Child
的對象時,考慮到其父類的副本構造函數是私有的,會發生什麼情況。它是不確定的行爲?無論何時我試圖複製
Child
類型的對象,我都希望得到編譯時錯誤。我認爲孩子的默認拷貝構造函數會嘗試調用Uncopyable類的私有拷貝構造函數並導致編譯錯誤。爲什麼它不給編譯錯誤?
代碼被這樣設計的原因是因爲Child
類是巨大的。
當客戶端試圖複製一個Child
對象(調用Child
的析構函數而不調用Base
的析構函數)時,所需的行爲是拋棄子數據。
這段代碼實現了這一點,但我想它會導致未定義的行爲並且有內存泄漏(從未調用複製實例的Child
的析構函數)。
你想要一個'編譯時'錯誤還是你想扔掉孩子的數據?這些是相互矛盾的陳述,除非我錯過了一些東西。 – Chip
@Chip修復它。謝謝。 –