2

次のように、クラスの演算子 + をオーバーロードしようとしています。

MyClass MyClass::operator +(const MyClass& rval) const {
 MyClass ret(m_src); // m_src is member of MyClass: char* m_src;
 ret.Add(rval); // this->m_src + rval, this method work correctly 
 return ret; // so, in ret.m_src I have correct value
} // but after this C++ call destructor for ret

デストラクタ:

delete[] m_src; // because in some methods I allocate dynamic memory

したがって、デストラクタはメモリをクリアし、関数はゴミを返します。どうすればこの状況を回避できますか? デストラクタを削除すると、関数は正常に動作しますが、この場合、メモリリークが発生します:(

PS: 残念ながら、オーバーロード + のプロトタイプを変更することはできません。ありがとう。

4

2 に答える 2

2

これを回避するには、次を置き換えます。

char *m_src; 

に:

std::string m_src;

あなたのクラスでMyClass

クラスのメンバーとして得char *られるものは、手動のメモリ管理を台無しにするのが簡単です。それを暗黙的な RAII ベースのメモリ管理に置き換えるだけで、std::stringこれらすべての問題を解決できます。そして、これこそがstd::stringC++ における の存在の目的です。


std::string標準ライブラリクラスを使用できない場合(理由はわかりませんが)、 Rule of Threeに従っていることを確認する必要があります。

于 2013-02-03T08:03:41.410 に答える
0

必要なのは、コピーするコピー コンストラクターです。m_src

MyClass::MyClass( const MyClass& ref ) {
    m_src = new char[/*get len from ref*/];
    memcpy( m_src, ref.m_src, /* len from ref */ * sizeof(char) );
}

operator+これで、コピー コンストラクターで動作するように変更できます。

MyClass MyClass::operator +(const MyClass& rval) const {
    MyClass ret(rval); // use copy constructor
    ret.Add(rval); // this->m_src + rval, this method work correctly 
    return ret; // so, in ret.m_src I have correct value
}
于 2013-02-03T08:43:33.220 に答える