他のオブジェクトのコンストラクタで1オブジェクトのコンストラクタを呼び出そうとしていますが、削除する際に問題があります。コードの重要な部分は次のようになります:削除を呼び出さずに関数をC++に渡すコンストラクタ
class command {
public:
command(const string& s) {
x = (char*) calloc(s.size()+1, 1);
memcpy(x, s.c_str());
}
~command() {
free(x);
}
private:
char* x;
}
このコンストラクタmallocsは、デストラクタで解放する必要があるchar *です。
class pair {
public:
pair(command comm1in, command comm2in)
:comm1(comm1in), comm2(comm2in){};
private:
command comm1;
command comm2;
}
この1つはで送信されたコマンドにその2つのフィールドを設定しようとします。 私は(ただし、間違っているかもしれない)、それはまた、彼らのコピーコンストラクタを呼び出すと思います
別の関数で、私はペアのコンストラクタを呼び出しますそう
pair p(command("something"), command("something else"));
のように、残念ながら、これはペアのコンストラクタでコピーコンストラクタだけで作成された値にデストラクタを呼び出して、その後の効果があります。
コピー/削除プロセスを行わずにcomm1とcomm2を初期化する良い方法はありますか? 私はC++ 11がrValue参照とstd :: moveを持っていると思いますが、それらがここで再生されるかどうかはわかりません。
を記述する必要はありません。 – Aganju
@Aganjuあなたが自分のリソースを管理する必要がある状況にあっても正しい場合は、[3/5/0のルール(http://en.cppreference.com/w/cpp/language/ rule_of_three)。 –
なぜ 'command'のコンストラクタとデストラクタにブレークポイントを設定しないのですか?次に、作成されて破棄されるオブジェクトのアドレスをそれぞれのケースで記録し、それらが一致しているかどうか、それぞれが何回呼び出されたかを確認することができます。これは、あなたに何が起こっているかのいくつかの洞察を与えるかもしれません。 – user1118321