0

そこで、クラスで作成した ADT 用にオーバーロードされた代入演算子のこれら 2 つのバージョンを作成しました。同じ ADT に対してオーバーロードされた ostream << 演算子と組み合わせて使用​​すると、異なる結果が表示されます。なんで?この問題が発生しているのは、メモリを他のバッファに割り当て解除したためですか?

void Text::operator= (const Text &other) { 
if (this != &other) {
    delete [] buffer;
    bufferSize = other.bufferSize;
    buffer = new char[bufferSize + 1];
    strcpy(buffer, other.buffer);
    }
}

 void Text::operator= (const Text &other) { 
if (this != &other) {
    delete [] buffer;
    bufferSize = other.bufferSize;
    buffer = new char[bufferSize + 1];
    for (int i = 0; i < bufferSize; i++) {
         buffer[i] = other.buffer[i];
     }
}

これが私のオーバーロードされた ostream <<,

ostream & operator << (ostream &output, const Text &outputText) {
output << outputText.buffer;
return output;
}

不一致は次のように発生します。

最初の出力は次のとおりです。Hey Jude

2 つ目の出力は次のとおりです。Hey Jude(random garbage)

4

2 に答える 2

6

2 番目のコード スニペットは、終端の null ターミネータを追加しないため、ガベージ (strcpy()終端の null をコピーします)。forループの後にヌル ターミネータを明示的に追加する必要があります。

buffer[bufferSize] = 0;
于 2012-09-17T21:29:33.843 に答える
2

ちょっとしたコツ:

buffer = new char[bufferSize + 1]();

これ:

strcpy(buffer, other.buffer);

null 終了文字もコピーします。これ:

 for (int i = 0; i < bufferSize; i++) {
     buffer[i] = other.buffer[i];
 }

bufferSize+1スキップする位置にあるため、そうではありません。

bufferSize+1配列を値で初期化するのではなく、位置を反復することになるでしょう。

わかりました、それをスクラップしstd::stringます。代わりに a を使用します。そうすれば、コピー、割り当て、または破棄について心配する必要はありません。

于 2012-09-17T21:29:36.000 に答える