代码之家  ›  专栏  ›  技术社区  ›  Naveen

new在任何情况下都会返回NULL吗?

  •  48
  • Naveen  · 技术社区  · 16 年前

    我知道,根据C++标准,如果新的内存分配失败,它应该抛出STD::BADOLALOLC异常。但我听说有些编译器,如VC6(或CRT实现?)不遵守它。这是真的吗?我这样问是因为在每个新语句之后检查NULL会使代码看起来非常难看。

    3 回复  |  直到 15 年前
        1
  •  60
  •   Wolf    10 年前

    VC6在这方面违约。VC6的 new 0 (或 NULL ).

    处理程序:

    如果您有为VC6行为编写的旧代码,则可以通过在名为 nothrownew.obj fairly complicated set of rules 在7.0和7.1编译器(VS2002和VS2003)中,确定它们默认为非抛出还是抛出 刚出现的 .

    看来 MS cleaned this up nothrownew.obj .

    请注意,您可以指定所需的 刚出现的 归来 0 std::bad_alloc 使用 std::nothrow 参数:

    SomeType *p = new(std::nothrow) SomeType;
    

        2
  •  20
  •   unwesen unwesen    16 年前

    我想补充一点(有点争议)意见,即在分配尝试后检查NULL几乎是徒劳的。如果你的程序遇到这种情况,很有可能你只能快速退出。很可能任何后续分配尝试也会失败。

    我不是想说服你不要检查NULL,这当然是认真的编程。但你不会从中获得太多,除非在非常特殊的情况下,你可能可以存储一些恢复信息(而不分配更多内存),或者释放不太重要的内存,等等。但这些情况对大多数人来说相对较少。

    有鉴于此,我相信编译器会亲自抛出bad_alloc,至少在大多数情况下是这样。

        3
  •  9
  •   Brian R. Bondy    16 年前

    在C++规范的基础上,它总是抛出STD::BADYOLL,当你使用普通的新的没有参数的时候,当然也会有一些不兼容的编译器。

    不过,删除指针后,最好将指针设置为NULL。因此,仍然需要检查NULL。

    选项1:设置自己的新处理程序

    清理代码的安全方法是调用: set_new_handler 第一

    如果你更喜欢例外情况,那么这是你最好的选择。如果您希望更好地返回NULL,那么也可以通过在新处理程序中执行catch来实现。

    选项2:使用重载的新

    void* operator new (size_t size, const std::nothrow_t &);
    void* operator new[] (void *v, const std::nothrow_t &nt);
    

    因此,在您的代码中:

     char *p = new(std::nothrow) char[1024];
    

    这是 a good refrence for further reading

    推荐文章