在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 会发生内存泄露】
这里显示通过对象值调用析构函数 并不会真正的把内容从栈中销毁 所以对象还是存在的。
同理 显示调用构造函数也不会去重新创造一个对象出来。而且还可能造成内存泄露的情况发生。