实例中为NULL

问题描述

| 编写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
的行为如何,但是可以在此处进行有关此的讨论...)