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

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

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

 

你可能感兴趣的:(C++)