C++ 类的析构函数

很多博客已经就析构函数作了非常详细的讨论,我在这篇博客中仅仅对发生异常时析构函数的行为做讨论。

一、析构函数基础

1. C++ 析构函数

2. C++之类的析构函数

二、程序发生异常时析构函数的行为

在C++中,对资源应该使用类来管理,在构造函数中获得资源,在析构函数中释放资源。但是,当程序发生异常时(调用exit、抛出异常),析构函数是否能被正常的调用?答案是否定的。

1、调用exit()函数

观察如下代码


#include <iostream>

using namespace std;

class A{
public:
    A(){
        cout<<"构造函数"<<endl;
    }
    ~A(){
        cout<<"析构函数"<<endl;
    }
};

void quit(){
    exit(-1);
}
void exec(){
    throw std::runtime_error("test");
}

int main() {
    A a;
    quit();
    return 0;
}

它的输出为:


构造函数

Process finished with exit code 255

可以看到,在main函数之前调用exit(),析构函数是不会被调用的,这样就会造成资源释放失败。

2、程序抛出异常

观察如下代码


#include <iostream>

using namespace std;

class A{
public:
    A(){
        cout<<"构造函数"<<endl;
    }
    ~A(){
        cout<<"析构函数"<<endl;
    }
};

void quit(){
    exit(-1);
}
void exec(){
    throw std::runtime_error("test");
}

int main() {
    A a;
    exec();
    return 0;
}
 

它的输出为:


构造函数
terminate called after throwing an instance of 'std::runtime_error'
what():  test

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

同样可知,析构函数并未被调用。
阅读更多

扫码向博主提问

蠢医生王

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • 图形图像
  • C++和C
  • 网络编程
  • OpenCV
  • 电脑百科
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DumpDoctorWang/article/details/79966501
文章标签: C 析构函数
个人分类: C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭