【问题标题】:Operator new with nothrow option still throws exception带有 nothrow 选项的运算符 new 仍然抛出异常
【发布时间】:2011-11-25 04:33:32
【问题描述】:

有这样的代码:

#include <iostream>

int main(){
    for(;;){
        int* ptr = new (std::nothrow) int;
        if(ptr == 0){
            std::cout << 0 << std::endl;
            break;
        }
    }
    std::cin.get();
    return 0;
}

然而,这个程序仍然抛出 std::bac_alloc 异常,尽管 new 是用 std::nothrow 参数调用的。这个程序是用Visual C++ 2010编译的,为什么会抛出异常?

编辑:

在 Windows 上使用 mingw 的 g++,一切正常。

【问题讨论】:

  • 这个程序不应该编译。很遗憾,它确实如此。您应该添加#include &lt;new&gt;。无论如何,您使用的是哪个版本的 VC++?
  • 嗯,确实如此。 2010 年的版本。
  • 它也在 gcc 上编译。到底是什么让我相信实际运行它是个好主意?
  • @pmr:当然,在运行此程序之前,您会将ulimit 设置为较小的值:-) 顺便说一句,效果很好。
  • 也许 return 而不是 break,会发生什么?

标签: c++ exception new-operator nothrow


【解决方案1】:

我刚刚从 VC2010 运行了您的示例。抛出的不是新的(nothrow),而是__security_check_cookie

【讨论】:

  • 嗯,那似乎是一个编译器错误。
【解决方案2】:

This 解释了为什么它仍在投掷以及如何让它不投掷。似乎 nothrow 被忽略了。

如果您仍然想要 C 运行时库的非抛出版本的 new,请将您的程序与 nothrownew.obj 链接。但是,当您与 nothrownew.obj 链接时,标准 C++ 库中的 new 将不再起作用。

我找到了一篇关于此的相当深入的文章,但它有点过时了(VC 6),但问题可能仍然存在。 BTW VC 会忽略所有throw() 函数规范。

When Operator new(std::nothrow) Throws an Exception Anyway

【讨论】:

【解决方案3】:

0 必须格式化为"0"。这将占用几个字节;我敢打赌这就是原因。在std::bad_alloc::bad_alloc 上打断点你就知道了。

【讨论】:

  • 或者在新事物周围放置一个 try-catch 块,在整个函数周围放置一个 try-catch 块,以了解是否真的是 new 失败了。
  • 更好的是,检查在抛出 C++ 异常时中断的选项。
猜你喜欢
  • 1970-01-01
  • 2014-08-16
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多