4

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

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

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

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

4

2 回答 2

10

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

template<class Y> explicit shared_ptr(Y* p);

抛出: bad_alloc,或者当无法获取内存以外的资源时发生实现定义的异常。

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

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

于 2013-01-01T10:15:55.513 回答
3

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

你是否需要抓住它是另一个问题;您几乎可以肯定不需要在创建shared_ptr. 这只是另一个失败的分配,无论您处理失败的分配,都应该捕获(或不捕获)。

于 2013-01-01T10:15:19.193 回答