编写C ++时,我们假设以下代码行:
Object* obj = new Object();
如果此行既编译又不会导致异常或任何其他可见 运行时问题,执行此行后可以obj为NULL吗?
答案 0 :(得分:14)
不,obj
不能是NULL
。
如果new
失败,则会引发std::bad_alloc
异常。如果没有抛出异常,则obj
保证指向完全初始化的Object
实例。
new
的变体不会引发异常
Object *obj = new(nothrow) Object();
在这种情况下,如果obj
失败,NULL
将为new
,并且不会抛出std::bad_alloc
异常(尽管Object
的构造函数可以显然仍然抛出异常)。
在一些较旧的编译器上,new
可能不会抛出异常,而是返回NULL
,但这不符合标准。
如果您已经超载operator new
,则根据您的实施情况,它可能会有不同的行为。
答案 1 :(得分:4)
不,你的确切行不能表现得那样。如果没有抛出异常,obj
将始终指向有效内存。但是,如果无法分配内存,则以下行将返回0
:
Object* obj = new (std::nothrow) Object();
答案 2 :(得分:3)
new
抛出std::bad_alloc
分配不是成功的。所以你应该抓住那个例外
如果您想在NULL
new.
,则应该使用nothrow new
答案 3 :(得分:2)
不,除非您禁用例外或重载std::new
以执行标准之外的操作(在失败时抛出std::bad_alloc
)。
(我不确定std::new
在禁用例外情况时的行为如何,但可以对此进行讨论here ...)