在编写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,则可能会因您的实现而有所不同.
不,你的确切线路不能像那样。obj如果没有抛出异常,它将始终指向有效的内存。0但是,如果无法分配内存,则将返回以下行:
Object* obj = new (std::nothrow) Object();
Run Code Online (Sandbox Code Playgroud)