2

そのため、C++ で OOP を学んでいて、独自の文字列クラスを作成するのは良い習慣だと思いました (もちろん、学習目的で)。解き方が分からない問題が出てきました。コードの平和は次のとおりです。

class String {
    char *str;
public:
    String(char const *str);
    ~String();
    String operator + (char const *str);
};

String::String(char *str) {
    this->str = _strdup(str);
}

String::~String() {
    free(this->str);
}

String String::operator+(char const *str) {
    char *temp = (char *) malloc(strlen(str) + strlen(this->str) + 1);
    strcpy(temp, this->str);
    strcat(temp, str);
    return temp;
}

ここでの問題は、このコードによってメモリ リークが発生することです。「演算子 +」から戻ると、コンストラクターが呼び出されます。コンストラクターは、より多くのメモリを割り当てて temp をコピーしますが、それを解放する方法が見つかりませんでした。

4

3 に答える 3

7

あなたoperator +は a を返すように定義されていますが、コンパイラがコンストラクターを使用して暗黙的に変換していることを意味するStringa を返しています。char*これは文字列をコピーしますが、リークしているオリジナルを解放しません。

他の人が示唆しているように、コードを改善するためにできることはたくさんありますが、実際のリークを修正するには、これを行うことができます:

String String::operator+(char const *str) {
    char *temp = (char *) malloc(strlen(str) + strlen(this->str) + 1);
    strcpy(temp, this->str);
    strcat(temp, str);
    String strTmp(temp);
    free(temp);
    return strTmp;
}
于 2013-03-20T22:33:52.773 に答える
3

文字列クラスを正しく書きたいのであれば、書くのは簡単な作業ではありません。あなたが直面している特定の問題について、いくつかの推奨事項を作成できます...

append()より大きなバッファーを作成するorを実装operator+=すると、内容がコピーされ、内部バッファーと新しく作成されたバッファーが交換され、古いバッファーが解放されます。

次にoperator+、簡単なタスクになります。

String operator+(String lhs, String const & rhs) {
   lhs += rhs;                 // lhs.append(rhs);
   return lhs;
}

(もちろん、これは、コピー コンストラクターと代入演算子の正しい定義を提供することを前提としています)

于 2013-03-20T22:33:53.553 に答える
1

operator= とコピー コンストラクターを実装するのを忘れていました。独自のものを提供しない場合、コンパイラはそれらを実装して、メモリリークの原因となるメンバーごとのコピーを実行します。

于 2013-03-20T22:31:27.273 に答える