gpt4 book ai didi

c++ - 标准库 (STL) 容器是否支持一种 nothrow 分配形式?

转载 作者:IT老高 更新时间:2023-10-28 22:35:49 25 4
gpt4 key购买 nike

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 和 friend 的(预期的!!)异常?


可能有一种方法可以编写一个自定义分配器来预分配内存,然后将此自定义分配器传递给 vector ,这样只要 vector 不要求比您事先放入分配器的内存更多,它不会失败?


事后考虑:真正需要的是一个成员函数 bool std::vector::reserve(std::nothrow) {...} 除了正常的储备功能。但是,由于只有在分配器也被扩展以允许 nothrow 分配时,这才有意义,所以它不会发生。似乎 (nothrow) new 毕竟对某些东西有好处:-)


编辑:至于为什么我什至在问这个:

我在调试时想到了这个问题(调试器的第一次机会/第二次机会异常处理):如果我将调试器设置为第一次机会捕获任何 bad_alloc,因为我正在测试低内存条件,它会如果它还捕获了那些已经在代码中很好预期和处理的 bad_alloc 异常,那就很烦人了。这不是/不是一个真正的大问题,但我突然想到,异常是针对特殊情况的,而我已经预料到代码中每个奇怪的调用都会发生的事情并不异常(exception)。

如果 new (nothrow) 有它的合法用途,那么 vector-nothrow-reserve 也会有。

最佳答案

默认情况下,标准 STL 容器类在底层使用 std::allocator 类进行分配,这就是它们可以抛出 std::bad_alloc 的原因如果没有可用的内存。有趣的是,关于分配器的 C++ ISO 规范声明任何分配器类型的返回值必须是指向能够容纳一定数量元素的内存块的指针,这会自动阻止您构建自定义分配器这可能会使用 nothrow 版本的 new 来发生这些静默分配失败。但是,您可以构建一个自定义分配器,如果没有可用内存则终止程序,因为那时返回的内存在没有剩余内存时是有效的,这是空洞的。 :-)

简而言之,标准容器默认抛出异常,您尝试使用自定义分配器自定义它们以防止抛出异常的任何方式都不符合规范。

关于c++ - 标准库 (STL) 容器是否支持一种 nothrow 分配形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4826838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com