MyStringクラスを定義しました。これで追加演算を実装します。メモリリークが起こるのは恐ろしいことです。したがって、私はデストラクタから動的に割り当てられたポインタを解放しました。私は、コードをコンパイルし、それを実行した場合動的割り当てポインタを持つクラスに演算子のオーバーライドを適用します。
#include <iostream>
class MyString {
private:
int _size;
char* _str;
public:
MyString() {
_size = 0;
_str = nullptr;
}
MyString(int size, char* str) {
_size = size;
_str = new char[size + 1];
strcpy(_str, str);
}
~MyString() {
delete[] _str;
}
void print() {
std::cout << _str << std::endl;
}
friend MyString operator+(const MyString& lhs, const MyString& rhs);
};
MyString operator+(const MyString& lhs, const MyString& rhs) {
char* temp = new char[lhs._size + rhs._size + 1];
strcpy(temp, lhs._str);
strcat(temp, rhs._str);
MyString ret(lhs._size + rhs._size, temp);
delete[] temp;
return ret;
}
int main() {
MyString first(5, "first");
MyString second(6, "second");
MyString add = first + second;
first.print();
second.print();
add.print();
}
しかし、first.print()
とsecond.print()
がうまく印刷されますが、add.print()
はゴミ値を出力します、そしてクラッシュ(デバッグアサートに失敗しました!)。
出力:
first
second
硼硼硼硼硼硼硼硼?흚 (and creashes :(..)
私は注釈を付けやデストラクタを実行した場合、それはうまく印刷しますが、メモリリークが発生します。なぜこうなった?私は、演算子オーバーライドのいくつかの例を見てきましたが、ポインタの動的割り当ての例は見つかりませんでした。
どのような提案も高く評価されます!この関数 'RET' の終わりにエラー 〜MYSTRING(){}
[3,5、および0のルール](http://en.cppreference.com/w/cpp/language/rule_of_three)については、おそらく学習する必要があります。 3つのルールを実装するだけで、問題を解決することができます。 –
ありがとう!デフォルトのコピーコンストラクタを追加すると、チャームのようにうまく動作します。 – youngminz