亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++自動析構時的順序問題

發布時間:2020-10-25 00:22:18 來源:腳本之家 閱讀:160 作者:weixin_43778179 欄目:編程語言

自動析構時是先析構后構造的.

//普通(非模板)類的成員模板
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調用DebugDelet::operator()(double*),釋放p
 int* ip = new int;
 //在一個臨時DebugDelete 對象上調用operator()(int*)
 DebugDelete()(ip);
 //實例化DebugDelete::opeartor()<int>(int*)const
 unique_ptr<int, DebugDelete>p2(new int, DebugDelete());
 //實例化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

可以看到,主動析構的正常進行.

函數結束后自動析構的,先創建了int后創建了string,但是先析構了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

這里構造時是先構造基類,再構造派生類.但是在析構時是先析構了子類,再析構了基類。

知識點補充:C++ 構造與析構的執行順序

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、執行順序

A[0]
B
A[0]
~B
~A[17]
~A[0]

3、B是棧上對象,C++保證棧上對象離開作用域,會自動調用析構方法。

4、考慮b中的對象,_A是棧上對象,_PA是指針,堆上對象,對于_PA必須delete,否則資源泄露。而對于_A不需要處理,會自動調用析構方法。可以這樣理解,對象b離開作用域,調用析構方法,而b中的_A當然也離開了作用域(皮之不存毛將存焉),調用析構方法。

5、碰到過這樣的情況,vs自動生成的析構方法有問題,導致崩潰。手動添加一個析構方法,就可以了。

總結

到此這篇關于C++自動析構時的順序的文章就介紹到這了,更多相關C++自動析構時的順序內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柏乡县| 涿州市| 乐都县| 卓资县| 鹿邑县| 漳浦县| 惠州市| 南昌县| 博客| 贵港市| 芜湖县| 武乡县| 元阳县| 新密市| 清水县| 大宁县| 海南省| 白玉县| 甘泉县| 本溪市| 广饶县| 四会市| 海口市| 柳州市| 安康市| 堆龙德庆县| 平果县| 治县。| 洞头县| 霍邱县| 上虞市| 娄烦县| 峨山| 宁乡县| 都兰县| 文昌市| 佳木斯市| 陵川县| 吴川市| 黑龙江省| 内江市|