析构函数抛出异常

析构函数抛出异常

C++中禁止异常信息传递到析构函数外

析构函数中不得直接或间接抛出异常;原因:析构函数中抛出异常可能导致堆栈展开(stack unwind)时异常嵌套,程序无法正常捕捉异常,直接终止;

如果析构时调用会跑出异常的函数,则需要捕获异常,但什么都不做,防止异常被传递到析构函数外。

Session::~Session()
{
 try {
  logDestruction(this);
 }
 catch (...) { }
}

构造函数抛出异常

C++ 里面当构造函数抛出异常时,其会调用构造函数里面已经创建对象的析构函数,但是对以自己的析构函数没有调用,就可能产生内存泄漏,比如自己new 出来的内存没有释放。

有两个办法。在Catch 块里面释放已经申请的资源 或者 用智能指针把资源当做对象处理。