C ++ 11とポインタ部材コピーコンストラクタ(浅いコピーディープコピー)

[1]シャローコピー

すべてに沿って、クラスの設計は、個人的に地域レベルであることを最もよく体現を考える:クラスは、ポインタメンバ変数が含まれています。

たとえば、次の一般的なシャローコピー:

1の#include <iostreamの>
 2  使用して 名前空間STDを、
3  
4  クラスHasPtrMem
 5  { 
 6  公共7      HasPtrMem():D(新しい INT0 ))
 8      {} 
 9HasPtrMem() 
 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(新しい新しい INT0 ))
 8。     {}
 9。      HasPtrMem(CONST HasPtrMem&H):D(新しい新しい INT(* HD)){} // コピーコンストラクタ、ヒープから、初期化とメモリを割り当てる* HD 
10HasPtrMem() 
 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)。

このような方法で、ダングリングの問題を回避することができます。

 

良い良い勉強、一日一日まで。

サイクルオーダーの概要を選択します

おすすめ

転載: www.cnblogs.com/Braveliu/p/12233571.html