【C++深度解析】49、构造函数、析构函数中的异常

1 构造中的异常

  • 构造过程立即停止,当前对象无法生成
  • 析构函数不会被调用
  • 对象所占用的空间立即收回

建议:不要在构造函数中抛出异常,当构造函数中可能产生异常时,使用二阶构造模式

编程实验:构造中的异常

// 49-1.cpp
#include<iostream>
using namespace std;
class Test
{
public:
    Test()
    {
        cout << "Test()" << endl;
        throw 0;
    }
    virtual ~Test()
    {
        cout << "~Test()" << endl;
    }
};
int main()
{
    Test* p = reinterpret_cast<Test*>(1);
    try
    {
        p = new Test();
    }
    catch(...)
    {
        cout << "Exception" << endl;
    }
    cout << "p = " << p << endl;
    return 0;
}

构造函数中抛出异常。类指针使用 reinterpret_cast 让其指向地址为 1 的内存。由于构造函数中抛出异常,所以构造过程立即停止,当前对象无法生成,析构函数不会被调用,对象所占用的空间立即收回

编译运行:

$ g++ 49-1.cpp -o 49-1
$ ./49-1
Test()
Exception
p = 0x1

可以看到 p 指针地址还是 1,也反应了对象没有生成。

下面我们证明一下对象所占用的空间立即收回,使用 valgrind 进行内存泄漏检测,如果内存被收回则不存在内存泄漏,由于没有 delete,如果没被收回则存在内存泄漏。
在这里插入图片描述
可以看到没有出现内存泄漏。

如果将第 10 行的 throw 0; 注释,就会出现内存泄漏,我们来检测一下,可以看到出现了内存泄漏。
在这里插入图片描述

2 析构中的异常

析构函数的异常将导致对象所使用的资源无法完全释放。所以要避免在析构函数中抛出异常。

3 小结

1、构造函数和析构函数中不要抛出异常

发布了298 篇原创文章 · 获赞 181 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/104661313
今日推荐