[C/C++]newのいくつかの使い方

1334 ワード

new expression
これは、次のような最も一般的な使い方です.
class A
{ int a; };
A* array = new A[101];

グローバルなoperator new
これはC++標準ライブラリがプログラマのために用意したデフォルトオペレータ関数で、オブジェクトメモリを返しますが、オブジェクトの構造をしません.mallocと似ていますが、例外を投げ出すことができます.デフォルトはbad_です.alloc、たとえば:
A* array = (A*) ::operator new( sizeof(A) * 101 );

オブジェクトのoperator new
これは、グローバルな関数operator new呼び出しを上書きできるユーザオブジェクトで独自に定義されたoperator newです.オブジェクト内のメンバー関数は、メモリを割り当てずに情報のみを印刷することもできます.例:
class A
{
	int a;
	void* operator new( size_t size )
	{
		printf("haha
"); } };

placement new
placement newの役割は、オブジェクトを作成する(クラスのコンストラクション関数を呼び出す)が、メモリを割り当てるのではなく、既存のメモリブロックの上にオブジェクトを作成することです.繰り返し作成して削除する必要があるオブジェクトでは、割り当て解除メモリのパフォーマンス消費量を削減できます.
使い方はnewに割り当てられたポインタと構造関数を渡すことです.例:
size_t sz =  sizeof( A );
A* ptr = (A*) malloc( sz );
new(ptr) A();  //      A  
A* ptr2 = (A*) malloc( sz * 100 );
new(ptr2) A[100];  //  ptr2  ,    100 A  


ユーザはコンストラクション関数をアクティブに呼び出すことができないのでplacement newを借りる必要がありますが、ユーザはコンストラクション関数をアクティブに呼び出すことができるので、これらのオブジェクトを使い切った後、コンストラクション関数を呼び出し、メモリを割り当てる方法でメモリを解放します.
ここでは概略コードにすぎませんが、実際にmallocはoperatornewよりもどれだけ時間を節約するかはわかりません.placement newはパフォーマンスを考慮するために使用されることが多いので、メモリプールと組み合わせて使用されます.