定義一個base類,以及建構式、拷貝建構式、移動建構式、解構式。
class base{
public:
base():c(new int(1)), s("x"){
cout << "defaut construct base" << endl;
};
int *c;
string s;
base(base&& bas):c(bas.c), s(bas.s){
bas.c = nullptr;
cout << "move construct" << endl;
}
base(base& bbb){
c = new int(*bbb.c) ;
s = bbb.s;
cout << "copy construct" << endl;
}
~base(){
cout << "delete" << c << endl;
delete c;
cout << "deconstruct base" << endl;
}
};如下運行后
base ba1;
base &&ba2 = std::move(ba1);
base ba3(std::move(ba1));
ba2.~base();
ba1.~base();
不報錯,從列印看到一共進行了4次析構。為什么?如果只析構一個ba2或ba1,也可以正常。
delete0
deconstruct base
delete0
deconstruct base
delete0x133cc20
deconstruct base
delete0
deconstruct base
如果按如下運行會報錯double free:
base ba1;
cout << ba1.c <<endl;
base &&ba2 = std::move(ba1);
ba2.~base();
我理解因為ba2和ba1指向同一塊區域,所以會有重復釋放的錯誤。那為啥移動構造后,就可以重復釋放了呢?
uj5u.com熱心網友回復:
值型別的資料,沒有必要自己呼叫解構式,程式會自動呼叫他們,你自己呼叫了兩次,所以顯示呼叫四次你這里只有兩個類,一個ba1,一個是通過移動構造的ba3。
uj5u.com熱心網友回復:
中間析構是我故意呼叫看結果的。這4次析構分別析構的是哪幾個物件呢?我中間析構了,最后系統又析構一次,是否存在重復析構呢?
uj5u.com熱心網友回復:
base ba1;base &&ba2 = std::move(ba1);
base ba3(std::move(ba1));
ba2.~base();//1次
ba1.~base();//2次
ba1出了生存期,自動再回呼叫一次
ba3//同上
共四次
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/221225.html
標籤:C++ 語言
上一篇:0x00512031 處(位于 sandanfeiji.exe 中)引發的例外: 0xC0000005: 寫入位置 0x0051C020 時發生訪問沖突。
