由STL所想到的 C++显示调用析构函数

  在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 会发生内存泄露】

  这里显示通过对象值调用析构函数 并不会真正的把内容从栈中销毁 所以对象还是存在的。

  同理 显示调用构造函数也不会去重新创造一个对象出来。而且还可能造成内存泄露的情况发生。

原文地址:https://www.cnblogs.com/sfwtoms/p/3931047.html