3

したがって、問題のコードは次のとおりです。

const String String::operator+ (const String& rhs)  
{  
    String tmp;  
    tmp.Set(this->mString);  
    tmp.Append(rhs.mString);  
    return tmp;  
}  

もちろん、これは文字列をスタックに置き、削除されてガベージを返します。また、ヒープに配置すると、メモリリークが発生します。では、これをどのように行うべきですか?

4

4 に答える 4

11

作業コピー コンストラクターがある場合、ソリューションはガベージを返しません。String オブジェクトtmpは、ブロックの最後で破棄される前に結果オブジェクトにコピーされます。

交換することでこれをより良く行うことができます

String tmp;
tmp.Set(this->mString);

String tmp(*this);

(これには正しく動作するコピーコンストラクターが必要ですが、returnステートメントにはとにかく必要です)

于 2010-01-18T21:47:06.717 に答える
4

3 つのルールに従って、コピー コンストラクター、コピー代入演算子、およびデストラクターを実装する必要があります。次に、スタックに割り当てられた一時が、戻り値を受け入れるストレージに安全にコピーされます。

于 2010-01-18T21:46:29.843 に答える
1

std::string を使用すると、これはリークしたりガベージを返したりしません

あなたのクラスにはコピーコンストラクタがありますか(それは機能しますか)

いずれにせよ、リークすることはありません (文字列の設計が非常に不十分である場合を除きます。つまり、デストラクタが呼び出されたときに内部メモリを解放しません)。

于 2010-01-18T21:50:13.970 に答える
0

メモリリークはありません。ただし、戻り値の型を「const String」ではなく String に変更したい場合があります。そうでなければ、この機能はあまり役に立ちません

于 2010-01-19T04:06:45.720 に答える