C ++将指针与NULL进行比较

时间:2013-06-24 20:41:47

标签: c++ null comparison equality

我对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亿次,显然我还没有等待输出。由于这是检查的“其他”部分,为什么会发生这种情况?我猜这个比较不起作用。任何帮助表示赞赏。感谢。

3 个答案:

答案 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(),它们经常被滥用,导致错误。