set_new_handler
是C++语言提供的一个函数,用于设置一个新的内存分配失败处理程序。当内存分配操作失败时,该处理程序将被调用。当我们在C++程序中使用new操作符申请内存时,如果系统找不到合适的内存块,就会触发内存分配失败,进而导致程序抛出std::bad_alloc异常。
set_new_handler(0)
的作用是设置一个新的内存分配失败处理程序为null(0),也就是取消默认的处理程序,取而代之的是在内存分配失败时不做任何处理。这样,程序就不会因为std::bad_alloc异常而崩溃,而是能够继续执行下去,用户可以根据需要选择如何处理内存分配失败的情况。
下面是两条示例说明:
- 示例一
#include <iostream>
#include <new>
using namespace std;
void new_handler()
{
throw bad_alloc();
}
int main()
{
set_new_handler(new_handler);
try
{
int* p = new int[1000000000];
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}
上述代码中,我们设置了一个新的内存分配失败处理程序new_handler
,当内存分配失败时,它会抛出一个bad_alloc
异常。在main
函数中,我们使用new
操作符尝试申请一个非常大的内存块,此时内存分配必定失败,从而触发了new_handler
。我们通过try-catch机制捕获了抛出的异常,并在屏幕上输出了异常信息:"std::bad_alloc"。
如果我们没有设置新的内存分配失败处理程序,程序会在触发异常后自动结束运行,输出信息如下:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
- 示例二
#include <iostream>
#include <new>
using namespace std;
void new_handler()
{
throw bad_alloc();
}
void func()
{
int* p = new int[1000000000];
}
int main()
{
set_new_handler(new_handler);
try
{
func();
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}
在这个示例代码中,我们定义了一个名为func
的函数,其中申请了一个非常大的内存块。我们在main
函数中调用func
函数,此时内存分配必定失败,进而触发了new_handler
。在try-catch
块中,我们捕获了new_handler
抛出的异常,并在屏幕上输出了异常信息:"std::bad_alloc"。
这个示例和示例一的主要区别是,示例一在main
函数内直接使用new
操作符,而示例二在一个函数内部使用new
操作符。这说明当我们在程序中使用了多个函数并且这些函数都有内存分配操作时,为了能够正确处理异常并避免程序崩溃,我们应该在每一个函数中设置新的内存分配失败处理程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:set_new_handler(0)有什么用 - Python技术站