在STL中的容器中的析構函數中,會經常調用destroy()這個函數
在STL中 destroy()被重載了 這點在這裡到不去討論 這裡貼最簡單的那個版本
template<class T>
inline void destory(T * pointer)
{
pointer->~T();
}
這裡通過指針調用了析構函數。C++ 顯示析構函數是一個怎麼執行流程呢?
2點來討論: 1)通過指針或者引用 2)通過值
#include <iostream> using namespace std; class A { public: A():a(2),b(3),c(4) {} ~A() { cout<<"析構函數被調用"<<endl; } int GETA() { return a; } private: int a; int b; int c; }; int main(int argv,char* argc[]) { A a; //調用析構函數 a.~A(); cout<<"********************"<<endl; // A *b=new A(); // b->~A(); cout<<"*******************"<<endl; cout<<a.GETA()<<endl; // cout<<b->GETA()<<endl; cout<<"程序結束"<<endl; }
對於a來講 的確調用了析構函數 但是在程序結束時 析構函數再次被調用
把上面的替換成a(這裡就不貼了) 最後程序結束時b所指向的對象不再次調用析構函數 但是通過b還是能訪問到類內的值。【當然這裡沒有delete b 會發生內存洩露】
這裡顯示通過對象值調用析構函數 並不會真正的把內容從棧中銷毀 所以對象還是存在的。
同理 顯示調用構造函數也不會去重新創造一個對象出來。而且還可能造成內存洩露的情況發生。
按照c++標准,編譯器會生成五個默認成員函數:
默認構造函數
拷貝構造函數
析構函數
operator=
operator&
你用到了operator= 但是並沒有去實現,因此編譯器調用默認的實現,默認的實現沒有打印構造的消息,因此感覺多destructing了一次。
C語言是面向過程的編程語言,構造函數和析構函數是用在面向對象的編程語言裡的。所以C裡面是沒有析構函數的!