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) が入力されると、実際には「Enter a Number:」の出力が開始され、おそらく 1000000000000 回、「十分なメモリがありません」という出力が期待されました。これはチェックの「else」部分にあるため、なぜこれが起こっているのですか? 比較がうまくいっていないと思いました。どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

1

まず、誰かがすでに気づいているように、実際には 10 億が割り当てられた可能性があります。整数に収まり (制限は ~ 20 億)、4 GB のメモリが必要です。

とにかく、印刷を開始する前に、入力で受け取った数値を印刷することをお勧めします (その後、1 秒間を置くか、ユーザーからの入力を待ちます)。その値は、期待したものとは異なる場合があります。 cin から正しく読み取るには大きすぎる可能性があります。

したがって、iとして定義することをお勧めしますunsigned 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 に答える