delete和析构函数间的关系及细节

来源:互联网 发布:如何给给淘宝号升级 编辑:程序博客网 时间:2024/05/18 22:47

http://blog.sina.com.cn/s/blog_78c5ff950102vjoe.html

个人心得:先看以下代码

#include
#include
using namespace std;  
class shape 

public:
 char x;
    shape(char m) 
    {  

     x=m;
     cout << "构造"<<endl;
     cout <<x<<endl;
    } 
    ~shape() 
    {  
     cout << "析构"<<endl;

     cout<<x<<endl;
    } 
}; 
int main() 

    shape a('a'); 
    shape* b = new shape('b');
    delete b;

    system("pause");
    return 0; 

当有那句delete b时,运行结果如图,

delete和析构函数间的关系及细节

也就是说delete b之后执行了shape的析构函数,而按了任意键之后,会立马闪出一个析构a来,这说明程序执行完成后,即在a所在的作用域结束后,执行了shape的析构函数

而当没有delete b时,运行结果如

delete和析构函数间的关系及细节

这说明暂时没有执行b的shape析构函数,按了任意键后,跟上面一样,也只会闪出一个析构a来,没有析构b

这说明,直接声明的对象,比如shape a,即在栈上面的对象,所在作用域结束后,会自动执行析构函数,而new出来的在堆上的对象,不调用delete,即使它所在的作用域已经结束,也不会调用析构函数,根据另外一篇文章内所述,可能程序结束后,OS(操作系统)会回收其堆内占用的内存,这样就不知道会干什么,会不会调用析构了。


delete详解:首先调用析构函数,完成类成员的释放,比如类成员有vector也指向了堆上的内存,就需要在析构函数中同样使用delete释放这块内存,或者说它自身处于一个容器当中,就需要在这个容器中erase它

然后再free掉整个对象的内存;

delete b过后,b仍然指向改内存,即地址不变,但指针可能为悬垂指针,访问它可能带来意想不到的结果,也可能正确访问,不确定,所以建议delete后,把指针设置成NULL,后面也可根据指针是否为NULL判断是否可用。

原创粉丝点击