无接受输入的无限循环

时间:2015-02-15 23:34:04

标签: c++ infinite-loop heap-memory

我正在编写一个简单的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;
}

在上述程序中,当我输入等于或小于20亿的i(输入数量)的值时,该程序按预期工作。然而,当我输入超过20亿的任何东西,如30亿或更高时​​,这个程序进入一个无限循环而没有在我的for循环中输入数字。

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

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

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

我在Mac OS X上运行该程序并使用g ++编译器进行编译。

2 个答案:

答案 0 :(得分:1)

1)您正在尝试分配大于2147483647的int值,这通常是此类型的最大值。 通常,如果您要处理如此大的数字,则应使用long long int(或来自<cstdint>的内容以获得更好的可移植性。)

2)失败后你不清楚cin的状态。 代码bollow生成无限循环:

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 对此的连续记忆。即使您成功分配了数组,它仍然是一个设计问题。您应该使用许多较小的数组或使用/创建合适的容器。

答案 1 :(得分:0)

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

顺便说一句,你是什么意思&#34;无限循环&#34;?程序崩溃还是永远不会结束执行?