实例化中为NULL

use*_*218 7 c++ null

在编写C++时,我们假设以下代码行:

Object* obj = new Object(); 
Run Code Online (Sandbox Code Playgroud)

如果这一行既编译并且不会导致异常或任何其他可见的运行时问题,那么在执行此行之后obj是否为NULL?

Sve*_*ven 14

不,obj不可能NULL.

如果new失败,它将抛出std::bad_alloc异常.如果没有抛出异常,obj则保证指向完全初始化的实例Object.

有一种变体new不会引发异常

Object *obj = new(nothrow) Object();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,if obj将失败,并且不会抛出异常(虽然构造函数显然仍然会抛出异常).NULLnewstd::bad_allocObject

在一些较旧的编译器上,new可能不会抛出异常而是返回NULL,但这不符合标准的行为.

如果您已经过载operator new,则可能会因您的实现而有所不同.


Xeo*_*Xeo 5

不,你的确切线路不能像那样。obj如果没有抛出异常,它将始终指向有效的内存。0但是,如果无法分配内存,则将返回以下行:

Object* obj = new (std::nothrow) Object();
Run Code Online (Sandbox Code Playgroud)