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