new
在分配大块内存时,运算符(或对于 POD,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;
}
...
std::containers 是否有任何此类构造,或者我是否总是必须std::vector
与朋友一起处理(预期的!!)异常?
是否有一种方法可以编写一个自定义分配器来预分配内存,然后将此自定义分配器传递给向量,这样只要向量不要求比您预先放入分配器更多的内存,它就不会失败?
事后思考bool std::vector::reserve(std::nothrow) {...}
:除了正常的储备函数之外,真正需要的是成员函数。但是,由于只有在分配器也被扩展以允许 nothrow 分配时,这才有意义,所以它不会发生。似乎(nothrow)新的东西毕竟对某些东西有好处:-)
编辑:至于我为什么要问这个:
我在调试时想到了这个问题(调试器的第一次机会/第二次机会异常处理):如果我将调试器设置为第一次机会捕获任何 bad_alloc,因为我正在测试低内存条件,如果它还捕获了那些已经在代码中很好预期和处理的 bad_alloc 异常。这不是/不是一个真正的大问题,但我突然想到,异常是针对特殊情况的,而我已经预料到代码中每个奇怪的调用都会发生的事情并不例外。
如果new (nothrow)
有它的合法用途,那么 vector-nothrow-reserve 也会有。