在c ++中保护,在main中不处理异常时未调用析构函数

时间:2016-04-19 16:56:19

标签: c++ exception guard raii

如果我们考虑使用g ++或clang的以下代码,则至少在main函数中没有捕获到异常时,不会调用Guard类的析构函数。我做了一个谷歌搜索,并没有找到任何有用的信息。

我在抽签中使用防护等级来实施RAII。因此,我发现这是非常令人失望的,特别是在处理信号量等资源时。

我认为C ++需要在抛出异常时调用析构函数。这种行为是标准的还是libstdc ++实现的?

感谢您对此事的任何帮助或建议。

#include<iostream>
#include<memory>

struct Guard
{
  Guard()
    : v(new int)
  {
    std::cout << "Guard()" << std::endl;
  }
  ~Guard(){
    std::cout << "~Guard()" << std::endl;
    delete v;
  }
private:
  int *v;
};

void test(){
  auto g = std::make_shared<Guard>();
  throw("youch");
}

void test2(){
  test();
}


int main(void){
  // try{
    test2(); 
  // } catch(...){

  // }
  return 0;
}

P.S。 :我不希望在main函数中添加try / catch块,因为我很高兴能够将异常追溯到调试器中发出的异常。

1 个答案:

答案 0 :(得分:0)

您正在处理实现定义的行为。按标准 [except.handle]

  

如果找不到匹配的处理程序,则调用函数std::terminate();在调用std::terminate()之前是否展开堆栈是实现定义的

因此g可能会也可能不会根据您使用的实施方式销毁RewriteRule ^([\w-]+)[/]?$ index.php?p1=$1 [L] RewriteRule ^([\w-]+)/([\w-]+)[/]?$ index.php?p1=$1&p2=$2 [L] RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)[/]?$ index.php?p1=$1&p2=$2&p3=$3 [L] RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)[/]?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [L] RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)[/]?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [L] 。你将无法依靠这一点始终以同样的方式处理。