3

我对 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)时,我预计输出“内存不足”,而实际上它开始打印“输入一个数字:”大概是 1000000000000 次,显然我还没有等待输出。既然这是在检查的“其他”部分,为什么会发生这种情况?我猜这个比较是行不通的。任何帮助表示赞赏。谢谢。

4

3 回答 3

2

如果您输入的第一个数字大于 2^31,则可能的原因之一如下:

在您第一次提供无效数据后 cin 变为无效状态,并且每个下一个数据输入操作(例如 >> )什么都不做(因此它不会等待您的输入),除非您明确地将 cin 返回到正常状态。

您可能的解决方案之一是:添加之后

cin >> p[n];

这段代码:

if (cin.fail()) {
   cout << "Bad data" << endl;
   cin.clear();
}
于 2013-06-24T20:46:40.367 回答
1

根据操作系统,即使没有足够的内存,也可能会批准对大块内存的请求,希望在需要时有足够的内存(某些进程可能已经释放了它持有的内存,或者更多的交换内存可能变得可用)。在那些系统中,对分配器的调用将成功,但内存将仅在需要时(即,当您使用内存页面时)交给进程,最终在无法分配下一页时触发错误。

这实际上不是 C++ 的问题,而是操作系统的行为。

于 2013-06-24T20:47:17.507 回答
1

首先,正如有人已经注意到的那样,可能实际分配了 10 亿。它适合一个整数(限制约为 20 亿),它需要您拥有 4GB 的内存。

无论如何,在开始打印之前,我建议您打印您在输入中收到的数字(然后暂停,一秒钟,或等待用户输入):该值可能与您的预期不同,因为它可能太大而无法从 cin 中正确读取。

因此,您可能希望定义iunsigned long long.

unsigned long 和 unsigned long long 有什么区别?

另外,请检查您是否没有将 cin 置于错误状态,给出无法解析的字符串

Mooing Duck建议编辑:

利用

 if (std::cin >> variable) { }

或者

 while(std::cin >> variable) { }

以避免这个问题。避免检查.bad(),.fail().eof(), 它们经常被误用,导致错误。

于 2013-06-24T20:47:46.950 回答