为什么 new(nothrow) 在 VS Code 上不起作用?

问题描述 投票:0回答:1

我在 VScode c++ 中编写了以下代码

当我输入 n 的大整数(例如 1000000000000000)时,我想要输出:

"Dynamic memory allocation failed.\nProgram will terminate."

如果我使用 g++ 编译器在 VScode 中运行代码,则永远不会显示输出。

但是,当我在 Programiz 这样的在线编译器中运行它时,它会显示出来。

程序如下:

#include <iostream>
#include <new> 

int main(){
  long int n;
  std::cout << "give n : ";
  std::cin >> n;
  
  int* a= new (std::nothrow) int[n];
  
  if (!a) {
    std::cout << "Dynamic memory allocation failed.\nProgram will terminate.";
    return -1;
  }
  return 0;
}

在 VScode 中,

#include <new>
不显示任何红色下划线, 所以我认为这意味着头文件存在并且确实包含在程序中。

那么问题出在哪里?

正如我所说,在在线编译器中,当我输入 1000000000000000 作为整数 n 的值时,输出就是所需的:

give n : 1000000000000000
Dynamic memory allocation failed.
Program will terminate.

=== Code Exited With Errors ===

但是在 VScode 中输出是:

if ($?) { g++ test.cpp -o test } ; if ($?) { .\test }
give n : 1000000000000000
terminate called after throwing an instance of 'std::bad_array_new_length'
  what():  std::bad_array_new_length

我可以做什么来解决这个问题?

编辑:

我使用 mingw-w64 的 GCC C++ 编译器 (g++) 和 GDB 调试器。

几天前,我下载了 VScode 版本 1.92,并按照其网站 https://code.visualstudio.com/docs/cpp/config-mingw 中的说明进行操作。

c++ visual-studio-code dynamic-memory-allocation nothrow
1个回答
0
投票

来自 as-if 规则

New-表达式还有一个来自 as-if 规则的例外:即使提供了用户定义的替换并且具有可观察到的副作用,编译器也可能会删除对可替换分配函数的调用。

所以,我们可能会认为

int* a = new (std::nothrow) int[n];
总是成功的。

产生程序

int main(){
  long int n;
  std::cout << "give n : ";
  std::cin >> n;
}

您可能会看到 here clang 优化了分配(并且没有输出消息),而 gcc 没有优化并执行调用,因此打印消息。

© www.soinside.com 2019 - 2024. All rights reserved.