1

我正在寻找一种技术来检测是否可以推送/插入/等。std::deque 的其他元素。它应该为我进行动态内存分配,但是当我的内存已满时会发生什么?通过使用 malloc() 我会收到一个 Nullpointer 但是在使用 std::deque 时如何检测内存不足的情况?

4

3 回答 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 回答