【问题标题】:Why we have to use new operator? [duplicate]为什么我们必须使用 new 运算符? [复制]
【发布时间】:2014-07-02 23:07:34
【问题描述】:

我试图理解为什么我们必须在 C++ 中使用 new 运算符。我写了一个小程序:

int N;
std::cin >> N;
int tab[N];

for (int i = 0; i < N; i++)
 tab[i] = i + 1;

for (int i = 0; i < N; i++)
 std::cout << "tab[" << i << "] = " << tab[i] << std::endl;

这个程序可以正常工作。我在 C 中使用此算法(而不是 malloc() 函数)注意到的相同行为。

【问题讨论】:

  • 用更大的 N 试试。比如说 1 亿...
  • 嗯...这个网站的名字说明了一切
  • @Brian 确实不是。这个问题是关于可变长度数组的 - 链接的副本不是。
  • @sepp2k 啊哈,没听懂。我会投票重新开放。
  • 在大多数您编写的 C++ 代码中,您根本不会(也可能不应该)使用operator new。这并不意味着动态分配是不必要的,远非如此。有时您不知道需要多少内存。有时您需要的超出堆栈允许的范围。有时您需要在函数调用之间保持分配。

标签: c++ new-operator


【解决方案1】:

您正在使用标准 C++ 中不可用的可变长度数组。但是,它是 C99 的一部分,一些 C++ 编译器将其作为扩展提供。见Why aren't variable-length arrays part of the C++ standard?

要在标准 C++ 中获得类似的行为,或使用比堆栈空间允许的更大的数组,您必须使用 new[]

当然,使用标准库容器(例如 std::vector)会更好,它会为您管理内存。

【讨论】:

    【解决方案2】:

    您的示例不是有效的 C++ 代码。如果它与您的编译器一起编译,那一定是因为您的编译器支持可变长度数组作为语言的扩展。如果你在标准兼容模式下编译,你应该得到一个错误。所以当你想编写符合标准的代码时,你需要new[]来创建可变大小的数组。

    如果您希望数组的生命周期比当前函数的生命周期更长,或者如果您不希望其大小受到可用堆栈空间的限制,您也需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-25
      • 2019-07-04
      • 1970-01-01
      • 2011-01-22
      • 2023-03-07
      • 2011-03-07
      • 2021-12-12
      • 2017-10-26
      相关资源
      最近更新 更多