【问题标题】:Why we need RAII for exception safety problems为什么我们需要 RAII 来解决异常安全问题
【发布时间】:2012-08-08 01:33:12
【问题描述】:
unique_ptr<X> f()
{
    unique_ptr<X> p(new X);     // or {new X} but not = new X
    // do something - maybe throw an exception
    return p;   // the ownership is transferred out of f()
}

当异常被抛出时,为什么我们关心对象 X 的存在, 为什么我们关心它占用的内存?

处理完异常后,进程将很快终止, 并且内存会被释放,为什么我们关心这个?

【问题讨论】:

  • 因为有时候人们真正关心的是保证他们的节目质量,而不是找借口。 :)怎么知道异常期间会发生什么?只有捕手知道。也许我抓住它,记录它,然后沿着另一条路继续前进。或者可能不是。为什么要猜测?
  • @GManNickG 如果我在我的软件中根本不使用异常,这是否意味着我不需要智能指针和 RAII?
  • 如果不使用异常意味着编译器在语言级别禁用了它们(也就是说,您使用的不是 C++,而是 C++-无异常),那么这是部分正确的。 RAII 对于自动化内存使用和建模转换仍然很有用(比较使用和不使用 shared_ptr 的引用计数是多么容易)。如果您的意思是 不使用异常,但它们仍然启用,那么您仍然只是在使用异常。例如new int 可以抛出。

标签: c++ exception c++11 raii


【解决方案1】:

因为在大多数应用程序中,进程不会立即终止,并且您不想泄漏内存。您不妨问一下为什么要关心内存泄漏。

【讨论】:

  • 应用程序中可能存在内存泄漏,将被泄漏终止。但除此之外,应用注定迟早要死。
  • @upton,一些异常可以通过允许程序在之后运行很长时间的方式进行处理。如果您的程序总是在出现异常后立即停止,那么您可以随意忽略传统建议 - 但只希望继承您的代码的人不是心理变态者。
【解决方案2】:

处理完异常后,进程将很快终止

说谁?

如果您在出现异常时所做的只是终止,那么是的,您可以忽略它。但是,您应该捕获许多例外情况。让你的代码在特殊情况下相对防弹并不是一件坏事。

一旦您决定真正开始尝试捕获异常而不是忽略它们,您就需要 RAII。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2020-08-06
    • 1970-01-01
    相关资源
    最近更新 更多