如果我们考虑使用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块,因为我很高兴能够将异常追溯到调试器中发出的异常。
答案 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]
。你将无法依靠这一点始终以同样的方式处理。