c++理解析构函数

Posted lesroad

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++理解析构函数相关的知识,希望对你有一定的参考价值。

析构函数有2种方式调用,一个是主动调用delete,另一个是根据RAII的规则,在对象的生命周期结束时自动析构。第一点没什么好说的,就简单讲下第二点。

对象的生命周期不等于是程序的生命周期,一般我们所谓的生命周期就是一个作用域,当变量或者对象离开这个作用域时就会自动析构。一般一对{}就是一个作用域,举个例子

int main()
{
    for(int i=0; i<10; i++)
    {
        A a;
    }
    a//错误,脱离作用域
}

 

一般在函数里的对象,离开函数时才算离开作用域,即return发生时,才执行析构,所以main中定义的对象不是在你说的return 0;之前执行的。return是一个离开的标志,只有遇到了该标志,才会开始离开。for结束后,就无法使用a了,因为该对象的生命周期已结束。

全局对象的话,是在程序结束时才执行析构,即遇到main中的return时,任何程序都是从main开始,到main结束的。

如果是new的对象,即使离开了作用域也会一直存在,必须主动delete,否则只有在结束程序时才会执行析构。这里在说下内存泄漏,举个例子

void fun()
{
    A *a = new A();
}
int main()
{
    while(1)
    {
        fun();
    }
    reutn0;
}

 

当离开fun时,虽然离开了作用域,但用new动态开辟空间的对象是不会析构的,你可以观察任务管理器,看到内存一直在上升。但你在其他地方却无法使用a所开辟的空间,因为a这个指针是保存在栈上的,当离开作用域后就自动析构(或者说自动消失了),但它所在分配空间是分配在堆上的,只有主动析构或程序结束,才会释放空间,也就是丢失了这块空间的地址,无法操作这块空间了。

以上是关于c++理解析构函数的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的析构函数中恢复对象?

c++析构函数需要异常处理吗?如需要实现有何要求?

为啥C++里面,析构函数会被调用两次

C++ 多线程服务器帮助

C++类与对象(详解构造函数,析构函数,拷贝构造函数,赋值重载函数)

C++递归解析树思路