欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年03月19日 11:19:17   作者:weixin_43778179  
這篇文章主要介紹了C++自動析構時的順序,通過實例代碼給大家講解了C++ 構造與析構的執(zhí)行順序,代碼簡單易懂,非常不錯對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

//普通(非模板)類的成員模板
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

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

函數(shù)結束后自動析構的,先創(chuàng)建了int后創(chuàng)建了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++ 構造與析構的執(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是棧上對象,C++保證棧上對象離開作用域,會自動調用析構方法。

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

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

總結

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

相關文章

  • 從零學習構造系統(tǒng)之bazel示例詳解

    從零學習構造系統(tǒng)之bazel示例詳解

    這篇文章主要為大家介紹了從零學習構造系統(tǒng)之bazel示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • C++實現(xiàn)洗牌發(fā)牌排序功能的示例代碼

    C++實現(xiàn)洗牌發(fā)牌排序功能的示例代碼

    本篇文章主要介紹了C++實現(xiàn)洗牌發(fā)牌排序功能的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 舉例講解C語言鏈接器的符號解析機制

    舉例講解C語言鏈接器的符號解析機制

    鏈接器的工作主要分為兩個階段:符號解析和重定位,符號解析的功能是將每個模塊符號引用綁定到一個確切的符號定義,這里我們就來舉例講解C語言鏈接器的符號解析機制
    2016-05-05
  • 基于C語言實現(xiàn)貪吃蛇小游戲

    基于C語言實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 一張圖總結C++中關于指針的那些事

    一張圖總結C++中關于指針的那些事

    今天小編就為大家分享一篇關于一圖總結C++中關于指針的那些事,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C++編寫生成不重復的隨機數(shù)代碼

    C++編寫生成不重復的隨機數(shù)代碼

    本文給大家匯總介紹了3種c++實現(xiàn)生成不重復的隨機數(shù)的函數(shù),十分的簡單實用,有需要的小伙伴可以參考下。
    2015-05-05
  • 詳解C++標準庫中處理正則表達式的類std::regex

    詳解C++標準庫中處理正則表達式的類std::regex

    std?是?C++?標準庫的命名空間,包含了大量標準的?C++?類、函數(shù)和對象,這些類和函數(shù)提供了廣泛的功能,包括輸入輸出、容器、算法、字符串處理等,這篇文章主要介紹了C++標準庫中提供的用于處理正則表達式的類std::regex,需要的朋友可以參考下
    2024-03-03
  • c++中typename和class的區(qū)別介紹

    c++中typename和class的區(qū)別介紹

    在c++Template中,很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢?
    2013-03-03
  • C語言的進制轉換及算法實現(xiàn)教程

    C語言的進制轉換及算法實現(xiàn)教程

    這篇文章主要介紹了C語言的進制轉換及算法實現(xiàn)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • C語言小程序 如何判斷兩個日期之差

    C語言小程序 如何判斷兩個日期之差

    輸入兩個日期,計算之間相差多少天。 用了兩種方法實現(xiàn),第二種利用結構體,代碼比較清晰,其余的都一樣
    2013-07-07

最新評論