Phi*_*ßen 9 c++ bad-alloc noexcept c++11
假设您拥有通常永远不会失败的功能,例如:
std::string convert_integer_to_string(int x);
Run Code Online (Sandbox Code Playgroud)
在市政当局,这将是一个候选人noexcept.但是,实现最有可能涉及动态内存管理,因此在为运算符分配内存时,它总是会抛出std :: bad_allocnew.
是否建议将该函数注释为noexcept?
从实际的角度来看,以合理的方式处理内存不足的情况是极其困难的.大多数程序只假设有足够的可用内存.std::terminate正如在某个noexcept函数抛出时所发生的那样,调用std::bad_alloc在这种情况下似乎是合理的.
对我来说noexcept是某种形式的文档.这是一个承诺,你(或优化器)可以安全地假设这个函数永远不会抛出.如果您正在编写一个不关心内存不足情况的应用程序,那么它仍然是一个有效的假设.
我想最安全的建议是noexcept如果std::bad_alloc抛出异常就永远不要使用.另一方面,我想知道是否有优势可以使用noexcept,假设您不关心内存不足的情况(即,如果std::terminate可以).
Die*_*ühl 12
如果函数可以出于某种原因抛出异常,即使它是std::bad_alloc,也不应该将其声明为noexcept.相对较少的函数实际上不能抛出异常,它实际上也很重要.noexcept函数的主要需求是允许在异常的情况下检测可用的错误恢复选项:例如,std::vector<T, A>在插入对象时可以使用移动构造,假设移动构造不抛出.如果移动构造可以抛出,则在实现强异常安全操作时,移动对象不能用于恢复异常.因此,如果移动构造可能因类型而失败,则T实例化std::vector<T, A>不能移动对象但需要复制它们.
特别要注意不能使用noexcept虚假文件:它是一种违反合同的,如果函数实际上可以抛出.如果发生此违规行为,系统会对某些定义的行为做出反应,这并不意味着您应该利用它....虽然简单的程序可能无法恢复并且在内存耗尽时死亡,但真正的程序可能至少需要存储足够的状态来恢复它们在死亡时留下的混乱,即,它对于任何功能都是不可接受的做出关于杀死程序的决定(当然,除非记录该函数的意图).
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |