我对C ++很新,所以请耐心等待。
我有以下程序来了解动态内存分配。
#include<iostream>
#include<new>
using namespace std;
int main ()
{
int i,n;
int * p;
cout << "How many numbers would you like to enter? ";
cin >> i;
p = new (nothrow) int [i];
if (NULL == p){
cout << "Not enough memory!";
}else{
for (n=0; n<i; n++){
cout << "Enter a number: ";
cin >> p[n];
}
cout << "You have entered: ";
for(n=0; n<i; n++){
cout << p[n] << ", ";
}
delete[] p;
}
return 0;
}
只要最初输入合理的金额,程序就会按预期运行。但是当输入一个巨大的数字(1000000000000)时,我预计输出“内存不足”,实际上它开始打印“输入一个数字:”大概是100亿次,显然我还没有等待输出。由于这是检查的“其他”部分,为什么会发生这种情况?我猜这个比较不起作用。任何帮助表示赞赏。感谢。
答案 0 :(得分:2)
如果输入的第一个数字多于2 ^ 31,则可能的原因之一如下:
在您提供无效数据后,第一次cin变为无效状态,并且每个下一个数据输入操作(例如&gt;&gt;)都不执行任何操作(因此它不会等待您的输入),除非您明确地将cin返回到正常状态
您可能的解决方案之一是:在
之后添加cin >> p[n];
这段代码:
if (cin.fail()) {
cout << "Bad data" << endl;
cin.clear();
}
答案 1 :(得分:1)
根据操作系统的不同,即使没有足够的内存,也可以批准对大块内存的请求,希望在需要的时候就足够了(某些进程可能已经释放了它所占用的内存,或者更多的交换内存可能会变得可用)。在这些系统中,对分配器的调用将成功,但只有在需要时(即当你使用内存页时)才会将内存传递给进程,最终在无法分配下一页时触发错误。
这不是C ++的问题,而是操作系统的行为。
答案 2 :(得分:1)
首先,正如有人已经注意到的那样,可能实际分配了10亿。它适合整数(限制大约20亿),它需要你有4GB的内存。
无论如何,在开始打印之前,我建议您打印输入中收到的号码(然后暂停,一秒钟或等待用户输入):该值可能与您预期的不同,因为它可能太大而无法从cin中正确读取。
因此,您可能希望将i
定义为unsigned long long
。
What is the difference between unsigned long and unsigned long long?
另外,请检查您不是putting cin in an error state giving a string it cannot parse
从Mooing Duck建议进行修改:
使用
if (std::cin >> variable) { }
或
while(std::cin >> variable) { }
避免这个问题。不要检查.bad()
,.fail()
或.eof()
,它们经常被滥用,导致错误。