推送到 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::allocator
allocate
function is using operator new
进行分配。
并且 operator new
如果失败则抛出 std::bad_alloc
异常。
我正在寻找一种技术来检测是否可以 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::allocator
allocate
function is using operator new
进行分配。
并且 operator new
如果失败则抛出 std::bad_alloc
异常。