实例化中为NULL

时间:2011-06-12 07:51:20

标签: c++ null

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

Object* obj = new Object(); 

如果此行既编译又不会导致异常或任何其他可见 运行时问题,执行此行后可以obj为NULL吗?

4 个答案:

答案 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 ...)