コピーコンストラクタの実装

が未だに悩みます。

クラスがポインタ型の変数を持つ場合です。

この際はデフォルトのコピーコンストラクタが使い物にならなので自分で書かなくてはなりません。中身の全てをヒープ(フリーストア)にとっておくのが唯一の正解と思っています参照カウンタを使っても呼び出し元の不正を完全に防ぐのは難しいし。それでも悩むのはコピーのコストを気にしすぎなんでしょう。

結局は、「呼び出し元が賢いと仮定する」か、「解放の責任を負わせない(≒余計なメモリを消費して安全)」かの2択になります(auto_ptrやshared_ptr(※1)は呼び出し元が賢いと扱う)

答えの違い(※2)を楽しめるのが「C++(※3)」って事で。





※1 C++のデファクトスタンダート?なライブラリ「boost C++」内にある参照カウンタ付きのポインタ。これが常に使えれば個人的には解決なのですが・・・。

※2 毎回違うのが正解という考え方もあります。オブジェクトが小さければコピーを取っても良いし、大きければコピーを生成するのは悪です(一瞬とはいえ、2倍以上メモリを使用します)。最近はプロトでさえ常に安全サイドに傾かせています。

※3 「Managed C++」や「Java」はメモリ管理で楽しめないため嫌いです。

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz