c++newの3つの形態

2032 ワード

(1)new operator
newの最初の形態はnew operatorで、言語内で構築されており、再ロードできません.新operatorは、次の3つの作業を完了します.
1. allocate memory for this object.
2. call constructor to init that memory.
3. return the pointer of this object.
例:string*pStr=new string(「Memory Management」);
実際には次の3つのことができます.
//1. stringオブジェクトにrawメモリを割り当てる
void *memroy = operator new( sizeof(string) );
//2. コンストラクション関数を呼び出してメモリ内のオブジェクトを初期化
call string::string() on memory
//3. オブジェクトポインタの取得
string *pStr = static_cast(memory);
第1歩はメモリを申請し、operator newで完成する.ステップ2指定したメモリにコンストラクション関数初期化オブジェクトを呼び出しplacement newで完了します.これがnewの他の2つの形態です.
(2)operator new
Operator newは通常のオペレータであり、加算減算オペレータと同様に再ロードできます.
デフォルトではoperator newはスタックからメモリを申請しようとしますが、成功するとメモリポインタが返され、失敗するとnew_が呼び出されます.handlerは、その後、例外(bad_alloc)が放出されるまで前の手順を繰り返します.
operator new関数プロトタイプ:void*operator new(size_t size);
operator newはリロードできます.クラスを個別にリロードしたり、グローバルにリロードしたりできます(すべてのoperator newの動作を変更します).operator newをリロードした場合はoperator deleteをリロードする必要があります.
(3)placement new
(位置決めnew)割り当てられた元のメモリでオブジェクトを初期化します.newの他のバージョンとは異なり、メモリが割り当てられていない点があります.逆に、割り当てられたが構築されていないメモリへのポインタを受け入れ、オブジェクトを初期化します.placement new式は、特定の予め割り当てられたメモリアドレス上にオブジェクトを構築することができる.
placement newはc++標準ライブラリの一部であり、使用時にヘッダファイルを含める必要があります.
void *s = operator new( sizeof(A) );
A *p = (A*)s;
new(p) A(2013); // p->A::A(2013);
// processing code…
p->~A();

表示される呼び出しplacement newであれば、表示すべき呼び出しに対応するplacement delete:p->~A();この作業はもともとコンパイラによって自動的に完了するはずです.new operatorを使用すると、コンパイラはplacement newを呼び出すコードを自動的に生成します.したがって、特に必要でない限りplacement newを直接使用しないでください.placement newの使用は、デフォルトのnew operatorでメモリの管理が必要を満たすことができず、自分でメモリを手動で管理したい場合にのみ考慮されます.STLのallocatorと同様にplacement newを使用して、より柔軟で効率的なメモリ管理を実現します.
【学習資料】『高品質コードc++』『thinking in c++』