再審査への準備ができて自宅で流行し、中には、C ++を学ぶことは非常に低い効率です。第12章からより見ることがより困難に感じるようになりました。ゆっくり食べることをメモします。
第12章動的メモリ
12.1動的メモリとスマートポインタ
12.1.1share_ptrクラス
同様のスマートポインタと共通ポインタの使用。スマートポインタデリファレンスそれが指しているオブジェクトを返します。決意の条件でスマートポインタは、効果が検出された場合には、空の場合。
if(p1&&p1->empty())//判断p1是否为空以及其指向的内容是否为空
*p1 = "hi" //如果p1指向的内容为空,解引用p1,为其赋值
share_ptrクラスを使用している場合、我々は、getメソッドに注意を払う必要があります
p.get() //返回p中保存的指针,若智能指针释放了其对象,返回的指针也消失
make_share関数は、最も安全かつ動的なメモリ割り当て方法の使用であります
share_ptrコピーと割り当て、コピー割り当ては、参照カウントが1場合アウトスコープの1だけカウントだけインクリメントされたときに、カウントが0の場合に破壊されます。
知識の他のレビュー:
関数、クラスの関数定義の後にconstが、クラスのデータメンバを変更しないクラスの関数があります。言い換えれば、これらの機能は、読み取り専用の関数です。コンパイラによってデータメンバ値、エラー処理を変更しようとする際に、constメンバ関数として定義されます。
12.1.2直接メモリを割り当てます
メモリを割り当て、解放するC ++定義2つの演算子、新しいおよび削除
、新しい新しい割り当ては、オブジェクトのために割り当てられたポインタへのポインタを返します。
int *pi = new int;
int *pi = new int(1024); //pi指向的对象为1024
string *ps = new string(10, '9'); //ps指向的对象为999999999
メモリの枯渇を防ぐために、削除の式でメモリを解放するメモリの使用を終了した後。
それが明示的に解放されるまで注意は、内蔵のポインタ(代わりにスマートポインタの)動的なメモリ管理により、常に存在します。
12.1.3のshared_ptrと新しいと組み合わせて使用
スマートポインタと共通ポインタミックスすることはできません
shared_ptr<int> p2(new int(42)) //只能采用这种方式来创建智能指针
一方、別のポインタかどうかは、getを使用してスマートポインタの割り当てを初期化します。
コードがgetを使用できるようにするには、ポインタを削除していない場合、スマートポインタ代入に慣れ、コードにアクセスするためのポインタを渡すのに慣れることは現実的ではありません。
12.1.4スマートポインタと例外
異常終了しているので、スマートポインタは自動的に破棄されます
附属書:スマートポインタの注意
1.同じ組み込みのポインタ値に初期化される(またはリセット)スマートポインタを複数使用しません。
2.ドゥ削除しないでGET(ポインタが返されます)。(p.getは()スマートポインタはそのオブジェクトを解放する場合は、注意して使用する。保存されたポインタpを返し、オブジェクトが消滅へのポインタポイントを返します。)
3.初期化または他のスマートをリセットするには、get()を使用していませんポインタ。
4.あなたは、getを(使用している場合は)最後に、対応するスマートポインタはポインタが無効になる破壊する際に覚えて、ポインタを返します。
5.リソースの割り当ては、新しいスマートポインタ管理メモリではありません、彼に届けカスタムデリータを覚えています。
12.1.5 unique_ptrを
オブジェクトへのポインタのみを同時にunique_ptrを。
そして、新しいポインタと結合することができるのshared_ptr異なるが、同様のshared_ptrを返します。
unique_ptr<int> ps(new int(42));
同時に、我々は、リリースポインタを使用し、別の(非const)unique_ptrをポインタから転送された所有権をリセットすることができます
unique_ptr<string> p2(p1.release())//将p1指向的内存传递给p2
unique_ptr<string> p3(new string("Trex"));
p2.reset(p3.release()); //将p3指向的内容传递给p2
同時に、shared_ptrのと同様に、我々は、削除unique_shareにデバイスを提供することができます。
12.2動的配列
動的に新しい配列を割り当てるために、我々は、クラス名がここで割り当てられたオブジェクトの数を示し、角括弧の対続いたいです。
int *pia = new int[get_size()] //方括号内部可以不是常量
そう()と終了()関数を開始することができない、型が配列ではないため、ポインタを取得するために、ダイナミックアレイ要素タイプを割り当てます。
方向の動的に割り当てられた配列を初期化します。
int *pia = new int[10]; //10个未初始化的int
int *pia2 = new int[10]();//10个初始化为0的int
string *psa = new string[10];
string *psa2 = new string[10]();//10个空string
空の配列を初期化して正当である
リリースの動的配列:
動的配列を解放するために、我々は、削除の特別な種類を使用して、ポインタの前に括弧の空のペアを追加します。
delete p; //p必须指向一个动态分配的对象或者为空
delete [] pa; //pa必须指向一个动态分配的数组或者为空