无限循环不接受输入

Infinite loop without accepting input

我正在编写一个简单的 C++ 程序,它为我的程序分配动态内存,然后删除该内存。这是我的程序:

#include <iostream>
#include <new>
using namespace std;

int main ()
{
  int i,n;
  int * p;
  cout << "How many numbers would you like to type? ";
  cin >> i;
  p= new (nothrow) int[i];
  if (p == nullptr)
    cout << "Error: memory could not be allocated";
  else
  {
    for (n=0; n<i; n++)
    {
      cout << "Enter number: ";
      cin >> p[n];
    }
    cout << "You have entered: ";
    for (n=0; n<i; n++)
      cout << p[n] << ", ";
    delete[] p;
  }
  return 0;
}

在上面的程序中,当我输入的值 i(输入数)等于或小于 20 亿时,该程序按预期运行。但是,当我输入超过 20 亿的任何值(例如 30 亿或更高)时,该程序会进入无限循环,而不会在我的 for 循环中输入数字。

当我为 i 输入一个非常高的值时,我预计这个程序会失败,说它无法分配内存。

根据我的理解,我认为当我输入一个非常高的 int i 值时,我将超出整数数据类型的范围,但在这种情况下,它应该在 for 循环中接受我输入的数字作为我在那里有一个 cin 语句,而不是进入 for 循环,否则内存分配应该简单地失败。

当我将 i 的类型从 int 更改为 long 时它可以工作,但我很想知道 for i 是 int 类型,为什么它进入无限循环而不是在 for 循环中看到 cin 时取值?

我是 运行 这个程序 Mac OS X 并使用 g++ 编译器编译它。

一个32位有符号整数的最大值为2^31-1,即2147483647。 现在,如果您为 Int 变量分配更高的值,则行为非常出乎意料,请尝试查看我实际包含的内容。

顺便说一句,"infinite loop" 是什么意思?程序会崩溃还是永远不会结束执行?

1) 您正在尝试分配给 int 大于 2147483647 的值,这通常是该类型的最大值。 一般来说,如果你想处理这么大的数字,你应该使用long long int(或者<cstdint>中的一些东西以获得更好的可移植性)。

2) cin 失败后没有清除状态。 下面的代码生成无限循环:

int i = 0;
while (i <= 0)
{
    std::cout << "Enter a number greater than 10..." << std::endl;
    std::cin >> i;
}

你可以这样解决:

int i = 0;
while (i <= 0)
{
    std::cout << "Enter a number greater than 10..." << std::endl;
    if (!(std::cin >> i))
    {
        std::cin.clear();  // Clear error flag
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  // Remove incorrect data from buffer
    }
}

3) 您正在尝试创建一个非常大的数组。你需要几个 GiB 对此的连续记忆。即使你成功分配了数组,它仍然是一个设计问题。您应该使用许多较小的阵列或 use/create 合适的容器。