在我的学校项目中,我被要求创建一个不使用STL的程序 在程序中我使用了很多
Pointer* = new Something;
if (Pointer == NULL) throw AllocationError();
我的问题是关于分配错误:
1.当分配失败时,是否有新的自动异常?
2.如果是的话,如果我不使用STL(#include "exception.h
),我怎么能抓住它
3.正在使用NULL测试吗?
答案 0 :(得分:12)
是的,如果新操作符无法分配内存,它将自动抛出异常。
除非你的编译器以某种方式禁用它,否则new将永远不会返回NULL指针。
抛出bad_alloc
例外。
您还可以使用nothrow
版本的新版本:
int *p = new(nothrow) int(3);
如果无法分配内存,则此版本返回空指针。但是请注意,这并不能保证100%nothrow
,因为对象的构造者仍然可以抛出异常。
更多信息:http://msdn.microsoft.com/en-us/library/stxdwfae(VS.71).aspx
答案 1 :(得分:3)
- 分配失败时是否有新的autamtic异常?
- 如果是的话,如果我不使用STL(#include" exception.h),我怎么能抓住它?
醇>
是。看这个例子。它还演示了如何捕获异常!
try
{
int* myarray= new int[10000];
}
catch (bad_alloc& ba)
{
cerr << "bad_alloc caught: " << ba.what() << endl;
}
从这里开始:http://www.cplusplus.com/reference/std/new/bad_alloc/
3。正在使用NULL测试 enugh?
除非您重载new
运算符!
答案 2 :(得分:1)
是:std :: bad_alloc
在我看来,这不再是STL的一部分了。 (你可以抓住......但是你可能会失去其他例外的可能性。)
不需要,new会抛出异常而不返回NULL。
答案 3 :(得分:1)
如果无法分配请求的内存,则标准C ++会引发异常。如果您想要NULL而不是异常,则语法为
Whatever *p = new (std::nothrow) Whatever;
此语法只是“placement new”分配的一种情况,它允许分配器函数接收参数。
我在{C}代码new
之后看到检查NULL的大部分时间都是::operator new
的默认行为是返回NULL而不是像标准要求那样引发异常(这是IMO尝试(仍在尝试?)与可移植代码作斗争的众多领域之一。)
答案 4 :(得分:0)
标准new会在失败时抛出bad_alloc异常,因此不需要进行空检查。
答案 5 :(得分:0)
这取决于 旧的c ++编译器提供set_new_handler来捕获分配失败。 您还可以捕获bad_alloc异常。
http://en.wikipedia.org/wiki/New_%28C%2B%2B%29
如果你想控制它,你也可以覆盖operator new
/ operator delete
对