C++自動(dòng)析構(gòu)時(shí)的順序問題
自動(dòng)析構(gòu)時(shí)是先析構(gòu)后構(gòu)造的.
//普通(非模板)類的成員模板
class DebugDelete{
public:
DebugDelete(ostream &s = cerr) :os(s){}
template <typename T>void operator()(T*p)const
{
os << "deleting unique_ptr " <<typeid(T).name() <<endl;
delete p;
}
private:
ostream &os;
};
void demo_general_class_tempalte_member()
{
double *p = new double;
DebugDelete d;
d(p);//d調(diào)用DebugDelet::operator()(double*),釋放p
int* ip = new int;
//在一個(gè)臨時(shí)DebugDelete 對(duì)象上調(diào)用operator()(int*)
DebugDelete()(ip);
//實(shí)例化DebugDelete::opeartor()<int>(int*)const
unique_ptr<int, DebugDelete>p2(new int, DebugDelete());
//實(shí)例化DebugDelete::opeartor()<string>(string*)const
unique_ptr<string, DebugDelete>sp(new string, DebugDelete());
}
這里輸出
deleting unique_ptr double
deleting unique_ptr int
deleting unique_ptr class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
deleting unique_ptr int
可以看到,主動(dòng)析構(gòu)的正常進(jìn)行.
函數(shù)結(jié)束后自動(dòng)析構(gòu)的,先創(chuàng)建了int后創(chuàng)建了string,但是先析構(gòu)了string
class B
{
public:
virtual ~B(){ cout << "delete B" << endl; }
};
class D :B
{
public:
virtual ~D() override{ cout << "delete D" << endl; }
};
void demo_delete()
{
D d;
}
輸出
delete D
delete B
這里構(gòu)造時(shí)是先構(gòu)造基類,再構(gòu)造派生類.但是在析構(gòu)時(shí)是先析構(gòu)了子類,再析構(gòu)了基類。
知識(shí)點(diǎn)補(bǔ)充:C++ 構(gòu)造與析構(gòu)的執(zhí)行順序
1、代碼如下:
class A
{
public:
int _Id;
A():_Id(0)
{
printf("A[%d]\n",_Id);
}
~A()
{
printf("~A[%d]\n",_Id);
}
};
class B
{
public:
A _A;
A* _PA;
B()
{
printf("B\n");
}
~B()
{
printf("~B\n");
delete _PA;
}
};
int main(int argc, char* argv[])
{
{
B b;
b._PA = new A();
b._PA->_Id = 17;
}
return 0;
}
2、執(zhí)行順序
A[0]
B
A[0]
~B
~A[17]
~A[0]
3、B是棧上對(duì)象,C++保證棧上對(duì)象離開作用域,會(huì)自動(dòng)調(diào)用析構(gòu)方法。
4、考慮b中的對(duì)象,_A是棧上對(duì)象,_PA是指針,堆上對(duì)象,對(duì)于_PA必須delete,否則資源泄露。而對(duì)于_A不需要處理,會(huì)自動(dòng)調(diào)用析構(gòu)方法??梢赃@樣理解,對(duì)象b離開作用域,調(diào)用析構(gòu)方法,而b中的_A當(dāng)然也離開了作用域(皮之不存毛將存焉),調(diào)用析構(gòu)方法。
5、碰到過這樣的情況,vs自動(dòng)生成的析構(gòu)方法有問題,導(dǎo)致崩潰。手動(dòng)添加一個(gè)析構(gòu)方法,就可以了。
總結(jié)
到此這篇關(guān)于C++自動(dòng)析構(gòu)時(shí)的順序的文章就介紹到這了,更多相關(guān)C++自動(dòng)析構(gòu)時(shí)的順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C++中vector的兩個(gè)小tips分享
這篇文章主要給大家介紹了關(guān)于C++中vector的兩個(gè)小tips,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
結(jié)構(gòu)體對(duì)齊的規(guī)則詳解及C++代碼驗(yàn)證
在c語言的結(jié)構(gòu)體里面一般會(huì)按照某種規(guī)則去進(jìn)行字節(jié)對(duì)齊。本文就來介紹一下如何實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解下2021-08-08
C語言中static與extern關(guān)鍵字的深入解析
在C語言編程中,static和extern是兩個(gè)非常重要的關(guān)鍵字,它們各自有著獨(dú)特的用途,本文將深入探討這兩個(gè)關(guān)鍵字的工作原理、底層實(shí)現(xiàn)機(jī)制以及在實(shí)際開發(fā)中的應(yīng)用,感興趣的小伙伴跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧2024-09-09
MongoDB?C?驅(qū)動(dòng)程序安裝(libmongoc)?和?BSON?庫(libbson)方法
這篇文章主要介紹了安裝?MongoDB?C?驅(qū)動(dòng)程序?(libmongoc)?和?BSON?庫?(libbson),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09

