如果你通过编译来关闭异常-fno-exceptions所有被认为是noexcept的函数,例如by std::move_if_noexcept或者你是否仍然必须声明函数noexcept?
的new操作者(或吊舱,的malloc /释放calloc)支持分配的存储器大块,当失败的一个简单而有效的形式.
说我们有这个:
const size_t sz = GetPotentiallyLargeBufferSize(); // 1M - 1000M
T* p = new (nothrow) T[sz];
if(!p) {
return sorry_not_enough_mem_would_you_like_to_try_again;
}
...
Run Code Online (Sandbox Code Playgroud)
是否有任何这样的std :: containers构造,或者我总是要std::vector和朋友一起处理(预期的!!)异常?
是否有可能有一种方法来编写一个自定义分配器来预分配内存然后将这个自定义分配器传递给向量,这样只要向量不要求比预先放入分配器的内存更多,它就不会失败?
事后的想法:bool std::vector::reserve(std::nothrow) {...}除了正常的储备功能外,还需要一个成员函数.但是,既然只有扩展分配器以允许不进行分配,那只会是有意义的,它就不会发生.似乎(nothrow)新的东西毕竟是好事:-)
编辑:至于为什么我甚至问这个:
调试时我想到了这个问题(调试器的第一次机会/第二次机会异常处理):如果我将我的调试器设置为1st-chance catch任何bad_alloc,因为我正在测试低内存条件,那将是烦人的它还捕获了那些已经很好预期并在代码中处理的bad_alloc异常.这不是/不是一个非常大的问题,但我刚刚发现,布道说异常是针对特殊情况的,而且我已经预期会发生代码中每个奇怪的调用都不例外.
如果new (nothrow)它是合法的用途,那么vector-nothrow-reserve也会有.
在编写C++时,我们假设以下代码行:
Object* obj = new Object();
Run Code Online (Sandbox Code Playgroud)
如果这一行既编译并且不会导致异常或任何其他可见的运行时问题,那么在执行此行之后obj是否为NULL?