4

次のコードがどのように機能するのか疑問に思いました。

#include <iostream>
using namespace std;
int main()
{
    char* buffer = new char(NULL);
    while(true)
    {
        cin >> buffer;
        cout << buffer;
        cout << endl;
    }
    return 0;
}

任意のサイズの任意の量のテキストを入力でき、それが印刷されて返されます。これはどのように作動しますか?動的にスペースを割り当てていますか?

また、スペースを入力すると、テキストの次のセクションが新しい行に出力されます。gets(buffer);ただし、これは(安全ではない)を使用して修正されます。

また、このコードは「合法」ですか?

4

2 に答える 2

5

それはまったく安全ではありません。バッファの後にあるメモリが何であれ、それを書き換えてから読み取ります。これが機能しているという事実は偶然です。これは、cin / cout操作で、「ああ、1文字へのポインター、1文字だけ書く必要がある」とは言わず、「ああ、十分なスペースが割り当てられている」と言っているためです。

改善#1:

char* buffer = new char(10000)または単にchar buffer[10000];

これで、問題なく長めの段落を安全に書くことができます。

改善#2:

std::string buffer;

コメントであなたの質問に答えるために、C++はあなたに大きな記憶の間違いをさせるためのものです。コメントで述べたように、これは「必要のないものにお金を払わない」という言葉だからです。あなたはおそらくその一人ではありませんが、コードでこのレベルの最適化を本当に必要とする人がいます。

ただし、メモリについてまったく考える必要がない場合にも、それを行うための多くの方法が提供されます。しっかり言います。andまたはchar[]を使用newdeleteていて、それらを必要とする使い慣れたデザインパターンを使用しているため、またはそれらを必要とするサードパーティまたはCライブラリを使用している場合は、次のようになります。それを行うためのより安全な方法。

時間の80%を節約するいくつかのガイドライン:

-char[]は使用しないでください。文字列を使用します。

-引数を渡したり返したりするためにポインタを使用しないでください。参照で渡し、値で返します。

-配列を使用しないでください(例:int [])。ベクトルを使用します。あなたはまだあなた自身の限界をチェックしなければなりません。

これらの3つだけで、「かなり安全な」非Cのようなコードを作成できます。

于 2012-05-30T12:44:59.700 に答える
3

これがstd::string目的です:

std::string s;

while (true)
{
    std::cin >> s;
    std::cout << s << std::endl;
}

std::string動的にスペースを割り当てるので、他の場所でメモリを上書きすることを心配する必要はありません。

于 2012-05-30T12:48:17.800 に答える