【问题标题】:Does std::tr1::shared_ptr throw bad_alloc and a good idea to be in try/catch block?std::tr1::shared_ptr 是否抛出 bad_alloc 和进入 try/catch 块的好主意?
【发布时间】:2013-01-01 10:10:05
【问题描述】:

我实际上正在制作一个简单的 C++ SFML 游戏,我想学习更多关于 C++ 编程的知识。

现在我正在使用 shared_ptr 来管理资源。在创建新资源时,我对 shared_ptrs 有一些疑问,例如:

    shared_ptr< Resource > resource( new Resource( World::LEVEL ) );

根据 boost shared_ptr( Y * p ) 抛出 bad_alloc。 我不知道 std::tr1 是否也这样做。而且我不知道我是否应该担心将 shared_ptr 放在 try/catch 块中以检查是否抛出了 bad_alloc。这是一个好的编程习惯吗?

【问题讨论】:

  • 我真的不认为你需要担心是 shared_ptr 还是 new-operator 抛出了 bad_alloc。如果您担心这一点,不妨将所有“新”语句放在 try-catch-blocks 中。
  • 此外,您应该使用std::make_shared,它可以优化shared_ptr 内部结构以及消除bad_alloc 来自何处的区别。

标签: c++ boost


【解决方案1】:

根据 C++ 2011 标准,§20.7.2.2.1 ¶6:

template&lt;class Y&gt; explicit shared_ptr(Y* p);

抛出:bad_alloc,或 当资源不是内存时实现定义的异常 无法获取。

当您知道如何处理异常时,您就会捕获异常。如果您要处理内存不足异常并且有代码执行此操作,那么请务必将其放入 try-catch 中。如果您不编写任务关键型代码并且不希望在系统内存限制的边缘运行,则可能没有必要。请注意,一旦系统内存不足,您编写的几乎每一行代码都可能引发异常。

请务必注意,在现代硬件/操作系统上,“内存不足”并不意味着您已超出物理内存限制 - 您只能拥有 128MiB 的内存,即使使用10 倍,你可以拥有 8GiB 的物理内存,而当你只使用了一半的内存时就会出现错误。这是指您的应用程序可用的内存空间,操作系统将在必要时将其分页到磁盘(并假设可用磁盘空间)。

【讨论】:

    【解决方案2】:

    shared_ptr需要分配计数器,所以可以抛出 bad_alloc。 (IIRC,当它这样做时,它会在 指针传递给它。)

    你是否需要抓住它是另一个问题;你几乎 当然不需要在创建的函数中捕获它 shared_ptr。这只是另一个失败的分配,并且 无论您处理失败,都应该被抓住(或不被抓住) 分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-02
      • 2010-10-03
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2011-03-25
      相关资源
      最近更新 更多