我正在编写一个简单的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 ++编译器进行编译。
答案 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;?程序崩溃还是永远不会结束执行?