C++安全异常处理

Pet*_*etr 7 c++ security exception

让我们有一段代码(fstream只是一个例子,我们可以谈论动态内存分配......):


fstream f;
try {
f.open("xxx");
    ...
f.close();
} catch (...) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当出现问题我想关闭()文件(释放内存或其他),但我不知道f的状态.毕竟,异常可能来自f.open().我认为在catch子句中调用f.close()是不安全的,因为我不能再相信f了.

f也可以是一个指向动态分配的数组的指针,我想删除[],但是谁知道抛出异常后它指向的位置...

这可能不是很常见,但是当我绝对无法承受任何额外伤害时,我该怎么办?

我可以考虑立即中止().

谢谢.

Alo*_*ave 11

您应该使用RAII或在此广为人知的SBRM(基于范围的资源管理):)


Ale*_* C. 10

fstream析构者呼唤close你.抛出异常时,文件会自动关闭.

为了管理内存,您可以使用智能指针.

对于管理互斥锁或更常见的锁,大多数库为您提供了一个类,其析构函数为您解锁互斥锁.

永远不要在表单中编写代码:

acquire a resource
do stuff which can throw
release a resource
Run Code Online (Sandbox Code Playgroud)

而是使用析构函数为您释放资源的对象.

  • @Petr:当这样的事情成为问题时,根本不做任何事情(除了调试).您无法从代码中检测到这些问题. (4认同)
  • 如果某些东西不平衡堆栈,就像缓冲区溢出一样,那么你通常会搞砸.只是不要让任何类似的事情发生.;) (3认同)