質問: new Class2( new Class1(1,10,20) ); のようにnewしてすぐ渡すことに対応してみようかなと思ったため、上記のコードを書いてみました。 ここで問題に思っているのは、 「deleteをすべき場所はどこか」です。 main関数等のような呼び出し側でdeleteすればいいかもしれませんが、 Javaみたいな書き方はできないかな?と思ったので、それ以外の方法として 「デストラクタでもdeleteし、呼び出し側でもdeleteする」です。 ですが、これってOKなのでしょうか? どこかのサイト ( 多分、「C++の迷信」みたいなサイトだった気がします... ) には 「deleteにNULL ( nullptr ) を渡しても処理せずにreturnするような状態だから...」とありました。 ( 話題としては「コンストラクタから例外を投げるのはアリ?ナシ?」系でしたが。 ) 内部のことなので確かめようがありません... [ 情報 ] 言語: C++
回答: こんにちは。 呼び出し側(new Doerする側)で、「newしたClassAへのポインタ」を保持しない場合、呼び出し側でdeleteするのは面倒ですし構造が汚くなりがちです。 Doerのデストラクタでデストラクトするのが比較的良く使われる手法と思います。 ただし、その際はDoerのインスタンスを単純にコピーするようなコードを書くと、多重deleteしてしまいます。 ``` Doer* doer = new Doer( new ClassA() ); { Deor copy_to = *doer; // 何らかの処理 } // obj_は単純にコピーされているため、ここでdelete obj_;される。 // これは最初にnew ClassA()で確保したインスタンス delete doer; // ここでも再度 delete obj_;をやってしまい、多重解放となる。 ``` そのようなバグを回避するためにコピーコンストラクタとコピー演算子をdeleteしておくと、間違ってコピーするコードを書いた時にコンパイルエラーになるので安全性が高まります。