[1]シャローコピー
すべてに沿って、クラスの設計は、個人的に地域レベルであることを最もよく体現を考える:クラスは、ポインタメンバ変数が含まれています。
たとえば、次の一般的なシャローコピー:
1の#include <iostreamの> 2 使用して 名前空間STDを、 3 4 クラスHasPtrMem 5 { 6 公共: 7 HasPtrMem():D(新しい INT(0 )) 8 {} 9 〜HasPtrMem() 10 { 11 削除D。 12 D = nullptr。 13 } 14 15 INT * D。 16 }。 17 18 のint main()の 19 { 20 HasPtrMem A。 21 HasPtrMemのB(A) 22 23 coutの<< *広告<<てendl; // 0 24 coutの<< * BD <<てendl; // 0 25 } // 异常析构
これは、指示部材HasPtrMem変数dを含むタイプを定義します。
メモリ割り当てられたヒープポインタの新しい操作を受け入れる部材Dを構築するときに返される、とデストラクタは、割り当てられたヒープメモリを解放するための削除操作になりますとき。
主な機能には、宣言された型HasPtrMem主題、オブジェクトを初期化するために使用されるが、Bです。HasPtrMemのコピーコンストラクタを呼び出すC ++の構文によります。
暗黙的にmemcpyのような関数は、ビット単位のコピーを行って、コンパイラによって生成され、ここでコピーコンストラクタと。
そのようなコンフィギュレーションモードは、ヒープメモリの同じ部分に問題その広告とBD点を有します。
このように、スコープの主端、及びオブジェクトA、オブジェクトBのデストラクタが順次に呼び出されます。
1つのデストラクタの完了後(例えば破壊にオブジェクトBのように、BDが削除最初ある)場合、それはもはやメモリに効果的であるため、広告はそれは、「ダングリング」(ダングリングポインタ)となっていないことを特徴とします。
そして、ダングリングポインタの空きアップメモリは、重大なエラーが発生する可能性があります。
[2]ディープコピー
一般的に、宣言されていないクラスのコンストラクタの場合には、C ++クラスは、「浅いコピー」(shollowコピー)コンストラクタを生成します。
そして、最善の解決策は、「ディープコピー」(ディープコピー)を達成するために、ユーザー定義のコピーコンストラクタに結果のディープコピーの場合の補正です。
1つの#include <iostreamの> 2 使用して 名前空間STD; 3。 4。 クラスHasPtrMem 5。 { 6。 公共: 7。 HasPtrMem():D(新しい新しい INT(0 )) 8。 {} 9。 HasPtrMem(CONST HasPtrMem&H):D(新しい新しい INT(* HD)){} // コピーコンストラクタ、ヒープから、初期化とメモリを割り当てる* HD 10 〜HasPtrMem() 11。 { 12は 削除D; 13は D = nullptr A。 14 } 15 16 INT * D。 17 }。 18 19 INT )(主 20 { 21 HasPtrMem。 22 HasPtrMemのB(A) 23 24 coutの<< *広告<<てendl; // 0 25 coutの<< * BD <<てendl; // 0 26 } // 正常析构
HasPtrMemクラスはコピーコンストラクタを追加します。
ヒープから割り当てられたコピーコンストラクタ新しいメモリ、Dへのメモリ割り当てポインタバック、および初期化* Dの*の使用(HD)。
このような方法で、ダングリングの問題を回避することができます。
良い良い勉強、一日一日まで。
サイクルオーダーの概要を選択します