|
从 new 表达式中测试失败分配的方式取决于是使用标准异常机制还是使用 nullptr 返回。 标准 C++ 要求分配器引发 std::bad_alloc 或派生自 std::bad_alloc 的类。 可以处理此类异常,如以下示例所示:
#include <iostream>
#include <new>
using namespace std;
#define BIG_NUMBER 10000000000LL
int main() {
try {
int *pI = new int[BIG_NUMBER];
}
catch (bad_alloc& ex) {
cout << "Caught bad_alloc: " << ex.what() << endl;
return -1;
}
}
使用 nothrow 格式的 new 时,可以测试分配失败,如以下示例所示:
#include <iostream>
#include <new>
using namespace std;
#define BIG_NUMBER 10000000000LL
int main() {
int *pI = new(nothrow) int[BIG_NUMBER];
if ( pI == nullptr ) {
cout << "Insufficient memory" << endl;
return -1;
}
}
使用 nothrownew.obj 文件替换全局 operator new 时,可以测试失败的内存分配,如下所示:
#include <iostream>
#include <new>
using namespace std;
#define BIG_NUMBER 10000000000LL
int main() {
int *pI = new int[BIG_NUMBER];
if ( !pI ) {
cout << "Insufficient memory" << endl;
return -1;
}
}
可以为失败的内存分配请求提供处理程序。 可以编写自定义恢复例程来处理此类失败。 例如,它可以释放一些保留内存,然后允许分配再次运行。 有关详细信息,请参阅 _set_new_handler。
|
|