您好,登錄后才能下訂單哦!
自動析構時是先析構后構造的.
//普通(非模板)類的成員模板 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++自動析構時的順序內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。