捕获内存分配的异常
catching exception for memory allocation
void newHandler() {
cdebug << "memory allocation failure" << std::endl;
throw std::bad_alloc();
}
int main() {
std::set_new_handler(newHandler);
// ...
}
一旦 newHandler 被建立为我们的错误处理程序,它将被调用 当任何堆分配失败时。关于错误的有趣之处 处理程序是它将连续调用,直到内存 分配成功,或者函数引发错误。
我对上述文本的问题是 authore 所说的"直到内存分配成功或函数抛出错误"是什么意思。在这种情况下,函数如何抛出错误?要求举例了解。
感谢您的时间和帮助。
基本上,您的处理程序可能有 3 种行为
- 它抛出一个bad_alloc(或其派生类(。
- 它调用停止程序执行的退出或 abord 函数
- 它返回,在这种情况下,将发生新的分配尝试
参考: http://www.cplusplus.com/reference/new/set_new_handler/
如果您不想处理每个新呼叫上的分配错误,这将非常有用。根据您的系统(使用大量内存(,例如,您可以释放一些分配的内存(缓存(,以便下一次尝试内存分配可以成功。
void no_memory ()
{
if(cached_data.exist())
{
std::cout << "Free cache memory so the allocation can succeed!n";
cached_data.remove();
}
else
{
std::cout << "Failed to allocate memory!n";
std::exit (1); // Or throw an expection...
}
}
std::set_new_handler(no_memory);
目的是处理程序可以释放一些内存,返回,然后 new(( 可以重试分配。 new(( 将调用处理程序,只要分配一直失败。处理程序可以通过抛出 bad_alloc(( 来中止这些尝试,本质上是说"我无法释放更多内存,因此分配无法成功"。
更多细节在这里:
http://www.cplusplus.com/reference/new/set_new_handler/
相关文章:
- std::元组分配和复制/移动异常保证
- 从 C# 调用 C++ DLib 会导致错误的分配异常
- 我们应该在抛出异常之前取消分配内存吗
- C++中的内存分配(引发异常:读取访问冲突)
- 如何捕获源自静态分配对象的构造函数的异常?
- 如何实现,错误分配中止而不是抛出异常
- 当有大量内存分配时,如何处理C++编程中的异常
- 从 boost::存档:binary_iarchive 反序列化 std::string 时出现错误的分配异常
- 分配数组时有异常,将其分配为 2D 数组时没有异常
- Qt:如何在QByteArray中调试错误的分配异常
- 如果在构造函数引发异常后释放了分配的内存
- 分配内存后,构造函数处出现未捕获的异常
- 由将值分配给双精度类型的变量而导致的浮点异常
- 在分配scoped_ptr之前处理异常
- C++坏内存分配异常
- 将值分配给字符串向量时的 Cygwin 异常
- 具有空异常规范的运算符new在分配返回0时调用构造函数
- 无效解除分配时的 xmemory0 异常
- 抛出异常后,对象内分配的指针是否自动解除分配
- 通过分配c内存错误捕获c++异常