std :: tr1 :: shared_ptr throw bad_alloc,也是一个好主意

Does std::tr1::shared_ptr throw bad_alloc and a good idea to be in try/catch block?

本文关键字:一个 好主意 alloc shared tr1 ptr throw std bad      更新时间:2023-10-16

我实际上是在制作一个简单的C SFML游戏,我想了解更多的C 编程。

现在,我正在使用shared_ptr来管理资源。在创建一个新资源时,我对共享_ptr有一些疑问:

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

根据boost shared_ptr&lt;Y>(y * p)抛出bad_alloc。我不知道如果std :: TR1也这样做。而且我不知道是否应该担心将共享_ptr放入尝试/捕获块中以检查bad_alloc是否被抛弃。这是一个很好的编程实践吗?

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

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

投掷:bad_alloc或 当内存以外的其他资源时,实现定义的异常 无法获得。

当您知道如何处理它们时,您会发现异常。如果您要处理失误的异常,并且有代码可以这样做,那么一定要将其放入试用。如果您不编写关键任务代码,并且不要期望在系统内存约束的边缘运行,则可能没有必要。请注意,您编写的每一行代码几乎都可以在系统不在存储器上时会引发异常。

重要的是要注意,在现代硬件/操作系统上,"不记忆"并不意味着您超出了物理内存约束 - 即使您使用的是,您也只能拥有128mib的内存,也不会出现错误这是10倍,您可以拥有8GIB的物理内存,并在只使用一半的一半时就会出现错误。这是指您应用程序可用的内存空间,如果需要,操作系统将在该应用程序上磁盘(并假设可用的磁盘空间)。

shared_ptr需要分配计数器,因此可以投掷 bad_alloc。(IIRC,当它这样做时,它调用在指针传递到它。)

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