我正在寻找一种技术来检测是否可以推送/插入/等。std::deque 的其他元素。它应该为我进行动态内存分配,但是当我的内存已满时会发生什么?通过使用 malloc() 我会收到一个 Nullpointer 但是在使用 std::deque 时如何检测内存不足的情况?
问问题
94 次
3 回答
3
标准容器的分配由它们的分配器处理,默认为std::allocator
.
该std::allocator
allocate
函数operator new
用于分配。
如果失败则operator new
抛出异常。std::bad_alloc
于 2019-09-18T09:20:08.123 回答
1
使用文档。
例如,std::deque::push_back
我们读到:
如果抛出异常(可能是由于 Allocator::allocate() 或元素复制/移动构造函数/赋值),则此函数无效(强异常保证)。
假设您的类型不会抛出复制/移动操作,那么唯一可能抛出的地方是分配器。
std::allocator::allocate()
将std::bad_alloc
失败:
如果分配失败,则抛出 std::bad_alloc。
于 2019-09-18T09:19:55.743 回答
0
在标准容器中处理内存不足的情况被委托给底层分配器(第二个,通常没有指定的模板参数std::deque
)。如果你使用 default std::allocator
,它会在失败时引发 in std::allocator::allocate
,你可以将插入包装到一个 try-catch 块中:
try {
myDeque.push_back(42);
} catch (const std::bad_alloc& e) {
// Do something...
}
于 2019-09-18T09:19:19.817 回答