推送到 std::deque 时如何检测动态内存分配失败?

Howto detect a fail of dynamic memory allocation when pushing to std::deque?

我正在寻找一种技术来检测是否可以 push/insert/etc。 std::deque 的进一步元素。它应该为我做动态内存分配,但是当我的内存已满时会发生什么?通过使用 malloc() 我会收到一个 Nullpointer 但如何在使用 std::deque?

时检测内存不足的情况

处理标准容器内的内存不足情况被委托给底层分配器(第二个,通常未指定 std::deque 的模板参数)。如果您使用默认的 std::allocator,它会在 std::allocator::allocate 中抛出失败,您可以将插入包装到一个 try-catch 块中:

try {
   myDeque.push_back(42);
} catch (const std::bad_alloc& e) {
  // Do something...
}

使用 documentation.

例如,对于 std::deque::push_back,我们读取:

If an exception is thrown (which can be due to Allocator::allocate() or element copy/move constructor/assignment), this function has no effect (strong exception guarantee).

假设您的类型不会抛出 copy/move 操作,唯一可能抛出的地方是分配器。

std::allocator::allocate() 将在失败时抛出 std::bad_alloc

Throws std::bad_alloc if allocation fails.

分配 standard containers are handled by their allocator, which defaults to std::allocator

std::allocatorallocate function is using operator new进行分配。

并且 operator new 如果失败则抛出 std::bad_alloc 异常。