C++ダイナミックメモリとダイナミック配列

5703 ワード

グローバルオブジェクトは、プログラムの起動時に割り当てられ、プログラムの終了時に破棄されます.ローカル自動オブジェクトは、定義されたブロックに入ると作成され、ブロックから離れると破棄されます.ローカルstaticオブジェクトは、最初の使用前に割り当てられ、プログラムの終了時に破棄されます.
静的メモリは、ローカルstaticオブジェクト、クラスstaticデータメンバー、および任意の関数以外の変数を保存するために使用されます.
スタックメモリは、関数内に定義された非staticオブジェクトを保存するために使用されます.静的またはスタックメモリに割り当てられたオブジェクトは、コンパイラによって自動的に作成され、破棄されます.
スタックオブジェクトの場合、定義されたブロックの実行時にのみ存在し、staticオブジェクトは使用前に割り当てられ、プログラム破棄時に終了します.
静的メモリとスタックメモリに加えて、各プログラムにはメモリプールがあります.このメモリの部分は自由空間またはスタック(heap)と呼ばれます.プログラムは、動的に割り当てられたオブジェクトをスタックで格納します.ダイナミックオブジェクトが使用されていない場合は、コードを明示的に破棄する必要があります.
newダイナミック割り当てとオブジェクトの初期化の使用
自由空間で割り当てられたメモリは無名であるため、newは割り当てられたオブジェクトに名前を付けることができず、そのオブジェクトを指すポインタを返します.
//p          、         
int *p = new int;

デフォルトでは、動的に割り当てられたオブジェクトはデフォルトで初期化されます.これは、組み込みタイプまたは組合せタイプのオブジェクトの値が定義されていないことを意味し、クラスタイプのオブジェクトはデフォルトのコンストラクション関数で初期化されます.
//     string
string *ps = new string;
//pi         int
int *pi = new int;

動的に割り当てられたオブジェクトを直接初期化することができます.従来の構成では、c++11でもリスト初期化でもよい
// p         1024
int *p = new int(1024);
//ps       ‘9999999999’
string *ps = new string(10, '9');
//pv    ,   0 1 2 3 4
vector<int> *pv = new vector<int>{0, 1, 2, 3, 4};

動的に割り当てられたオブジェクトの値を初期化することもできます.タイプ名の後にカッコを付けるだけでいいです.
string *ps1 = new string; //        string
string *ps2 = new string() //       string
int *pi1 = new int; //       *pi1    
int *pi2 = new int(); //     0;*pi2 0

独自のコンストラクション関数を定義したクラスタイプ(stringなど)では、値の初期化を要求することは意味がありません.どんな形式を採用しても、オブジェクトはデフォルトの構造関数で初期化されますが、組み込みタイプでは2つの形式の違いが大きくなります.値初期化の組み込みタイプには定義済みの値があり、デフォルトの初期化オブジェクトの値は未定です.同様に、クラス内のコンパイラ合成に依存するデフォルトのコンストラクション関数の組み込みタイプメンバーの値も定義されていません.
カッコで囲まれた初期化器を提供すればautoを使用できます.この初期化器から、割り当てたいオブジェクトのタイプを推定します.ただし、コンパイラは初期化のタイプで割り当てるタイプを推定するため、カッコに単一の初期化器しかない場合にのみautoを使用できます.
auto p1 = new auto(obj); // p     obj       
                         //    obj     
auto p2 = new auto(a, b, c); //                

動的に割り当てられたconstオブジェクト
newでconstオブジェクトを割り当てるのは合法です
//        const int
const int *pci = new const int(1024);

//          const  string
const string *pcs = new const string;

他のconstオブジェクトと同様に、動的に割り当てられたconstオブジェクトを初期化する必要があります.デフォルトのコンストラクション関数を定義したクラスタイプの場合、const動的オブジェクトは暗黙的に初期化できますが、他のタイプのオブジェクトは明示的に初期化する必要があります.割り当てられたオブジェクトはconstであるため、newが返すポインタはconstを指すポインタである
メモリ消費量
プログラムが使用可能なすべてのメモリを使い切ると、new式は失敗します.デフォルトでは、newが必要な空間メモリを割り当てることができない場合、bad_というタイプが放出されます.allocの異常.newを用いて異常を投げ出すのを阻止する方法を変えることができます
//       ,new       
int *p = new int;
int *p1 = new (nothrow) int; //      ,new       

この形式のnewを位置決めnewと呼ぶ
ダイナミックメモリの解放
メモリの消費を防ぐために、ダイナミックメモリの使用が完了したら、システムに返さなければなりません.deleteでダイナミックメモリをシステムに返します.
newと同様にdelete式も2つの動作を実行し、所与のポインタが指すオブジェクトを破棄し、対応するメモリを解放します.