测试“返回”是否有用;新";在C++;? 在C++中,我通常看不到新的测试,我想知道为什么。

测试“返回”是否有用;新";在C++;? 在C++中,我通常看不到新的测试,我想知道为什么。,c++,new-operator,C++,New Operator,Foo*f=新的Foo //f被假定为已分配,为什么通常没有人测试new的返回?根据当前标准,new从不返回NULL,而是抛出std::bad_alloc。如果您不希望new抛出(按照旧标准),而是返回NULL,那么应该通过使用“(std::nothrow)”对其进行后期修复来调用它。 i、 e 当然,如果您有一个非常旧的或可能损坏的工具链,它可能不会遵循标准。通常没有人测试新代码中的新代码的返回,因为Visual Studio现在抛出了标准所说的方式 旧代码中,如果黑客已经做了一个避免丢弃的测

Foo*f=新的Foo


//f被假定为已分配,为什么通常没有人测试new的返回?

根据当前标准,new从不返回NULL,而是抛出std::bad_alloc。如果您不希望new抛出(按照旧标准),而是返回NULL,那么应该通过使用“(std::nothrow)”对其进行后期修复来调用它。 i、 e


当然,如果您有一个非常旧的或可能损坏的工具链,它可能不会遵循标准。

通常没有人测试新代码中的新代码的返回,因为Visual Studio现在抛出了标准所说的方式


旧代码中,如果黑客已经做了一个避免丢弃的测试,那么你最好还是测试一下。

这完全取决于C++的代码版本。 长期以来,C++规范已经指出,至少默认情况下,新的故障会导致C++异常,因此执行测试的任何代码都将是完全冗余的。
如今,大多数编程也针对虚拟内存操作系统,在虚拟内存操作系统中,几乎不可能出现内存不足的情况,而且内存不足的情况是非常致命的,因此让应用程序在下一次空访问时崩溃是终止任何操作的一种好方法

只有在嵌入式编程中,异常处理被认为开销太大,内存非常有限,程序员才会费心检查新的故障。

如前所述


在符合ISOC++标准的编译器中,如果内存不足,无法分配,则代码抛出一个类型为STD::BADYOLLC的异常。在try-catch块中处理错误或程序异常退出之前,所有后续代码都将中止。程序不需要检查指针的值;如果没有引发异常,则分配成功。”

这完全取决于编译器VC++版本6之前的版本,如果新运算符在非MFC应用程序上失败,则会给出NULL

现在,当你在VC++6中使用STL时,问题会变得更大,因为STL符合标准,当他需要一些内存时,它永远不会测试NULL,并且猜测在内存不足的情况下会发生什么

因此,对于仍然使用VC++6和STL的所有人,请查看本文以获得修复。

<> >代码>新< /COD>默认抛出<代码>:ST::BADYOLLYC/<代码>默认。如果使用默认值,检查null是过时的,但处理异常是必要的。这种默认行为与C++异常安全范例一致:它通常提供对象是构造的或未分配的

<
  • 如果使用
    new(std::nothrow)
    覆盖默认值,则必须检查null。“new”分配和提交页面,因此可能会耗尽内存,原因可能是页面描述符用完,也可能是没有可用的物理内存

  • 研究你的操作系统的内存管理。C/C++参考机器不知道你的操作系统是如何管理内存的,因此单靠语言是不安全的。例如,内存分配出现问题,请阅读C
    malloc()
    +Linux Overmit


  • 这个问题暗示了环境是DevStudio女士?没有什么。但是如果VisualStudio没有收到这个修复,那么海报将不太可能出现在这种情况下:“我通常不在C++中看到新的测试。“。所以我解释了。捕获异常并将数据保存到磁盘,可能是比让应用程序崩溃更好的方法……但是如何呢?现代C++在对象中到处都是对象创建。当一个“新的”失败时,人们强烈期望进一步尝试新的也会失败。这意味着将数据持久保存到磁盘的尝试也将失败。“几乎不可能耗尽内存”我不同意,在32位进程中,很容易耗尽虚拟内存-在windows中,您只能获得2 Gig的地址空间-任何涉及采样数据的域-视频,医疗等,可以很容易地填补这一点或碎片,导致分配失败这一切取决于你的应用领域。对于大数据集,使用STL类型的容器是否特别?就我个人而言,当我接近分配足够的内存以耗尽虚拟内存空间时,我会使用本机分配器,我会检查它是否失败。@Chris Becke:“但是如何?”。一种方法是预先分配一个“足够大”的内存块,注册一个新的_处理程序,释放它,然后抛出bad_alloc。应用程序捕捉到异常,现在有“足够”的内存可供它打印诊断并干净地退出。“它从不返回NULL”。。。然后你继续自相矛盾:)使用std::nothrow会使你陈述的第一部分变假:)它不会变假,只是有点不一致。new的“普通”verison永远不会返回NULL。不过,修复答案也不会有什么坏处!MSVC“按照旧标准”是哪一个标准?
    Foo* foo = new (std::nothrow) Foo;