zoukankan      html  css  js  c++  java
  • 由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 会发生内存泄露】

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

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

  • 相关阅读:
    Cornfields POJ
    二维RMQ模板
    降雨量 HYSBZ
    Frequent values UVA
    UVA
    Argus UVALive
    关于二分图有向边和无向边问题探讨
    Guardian of Decency UVALive
    SAM I AM UVA
    【062新题】OCP 12c 062出现大量新题-15
  • 原文地址:https://www.cnblogs.com/sfwtoms/p/3931047.html
Copyright © 2011-2022 走看看