これは、あなたが考えて何をしていません。
T* t2(t1);
あなたはポインタだけではなく、オブジェクトを宣言しているため。ポインタは、他のポインタの値に初期化されます。それは次のようになります。
T* t2 = new T (t1);
新しいオブジェクトを作成します。
コピーに関しては、ポインタ値がコピーされているだけで、ポインタが指すデータではなく、現在は浅いコピーを行っています。浅いコピーを行うと、元のコピーまたはコピーが破棄されたときに問題が発生します.m_var
が削除された場合、他のオブジェクトは削除されたメモリへのポインタを持ち、未参照動作TMを参照します。ディープコピーの修正これは:
T(const T* cpy)
{
m_var = new VarType (cpy->m_var); // VarType being whatever m_var is
}
これは今も、上記の削除の問題を防ぐために深くなければなりませんm_var
のタイプ、のためのコピーコンストラクタが必要です。
データを深くコピーするという欠点は、メモリを増やし、メモリを割り当ててデータをコピーするのにかなりの時間がかかることです。これは、参照カウントされたオブジェクトを使用して解決できます。これらはいくつかの味があり、スマートポインタが最も一般的です。ここで、同じ基本オブジェクトは、親オブジェクトのすべてのコピーによる参照です。親が削除されると、オブジェクトのスマートポインタのデストラクタは、そのオブジェクトへのすべての参照が削除されると、そのオブジェクトを破棄します。
スマートポインタの欠点は、1つの所有オブジェクトからデータを変更すると、すべての所有オブジェクトに表示されるデータが変更されることです。両方の世界を最大限に活用するには、「修正版のコピー」システムが必要です。これは、基礎となるデータが所有オブジェクトによって変更された場合にのみメモリ使用量を増加させます。
普通のコピーコンストラクタを書く必要はありません。コンパイラで生成されたもので十分です。 – Nawaz