R S*_*hko 12
不要在C++中使用setjmp/longjmp.问题是setjmp/longjmp是一个低级C API,无法正确处理堆栈展开.所以,如果你有这样的代码:
void dont_do_this(jmp_buf jmp)
{
std::string leakme("bad");
longjmp(jmp, leakme.length());
}
Run Code Online (Sandbox Code Playgroud)
不会调用字符串析构函数,你会泄漏内存.
由于这是未定义的行为,因此可能会发生更糟糕的事情.根据第18.7/4节:
函数签名longjmp(jmp_buf jbuf,int val)在本国际标准中具有更多限制行为.如果任何自动对象将被抛出的异常转移控制到程序中的另一个(目标)点,那么在控制点转移到相同(目标)点的long_mp(jbuf,val)调用具有未定义的行为.
| 归档时间: |
|
| 查看次数: |
1028 次 |
| 最近记录: |