问题描述
|
编写C ++时,假设下面的代码行:
Object* obj = new Object();
如果此行既编译又不会引起异常或任何其他可见的
运行时问题,执行此行后obj是否可以为NULL?
解决方法
不,
obj
不能是NULL
。
如果new
失败,它将抛出std::bad_alloc
异常。如果未引发任何异常,则保证“ 1”指向完整初始化的“ 6”实例。
new
的变体不会引发异常
Object *obj = new(nothrow) Object();
在这种情况下,如果new
失败,则obj
将是NULL
,并且不会抛出std::bad_alloc
异常(尽管Object
的构造函数显然仍然可以抛出异常)。
在某些较旧的编译器上,new
可能不会引发异常,而是返回NULL
,但这不是符合标准的行为。
如果您重载了operator new
,则其行为可能会因您的实现而有所不同。
, 不,您的确切行不能那样行。如果没有抛出异常,“ 1”将始终指向有效内存。但是,如果无法分配内存,则以下行将返回0
:
Object* obj = new (std::nothrow) Object();
, allocation3ѭ投掷std::bad_alloc
是分配不成功。因此,您应该捕获该异常。
如果要在new.
之后检查NULL
,则应使用nothrow new
, 不可以,除非您禁用了异常或使过载的“ 24”超出了标准功能(如果失败则抛出4),而不能做其他事情。
(我不确定禁用异常时,std::new
的行为如何,但是可以在此处进行有关此的讨论...)