4つのレベルのC ++のメモリ割り当て:
比較の4つのレベル:
メモリの割り当てとテストのリリース:
無効 * P1 = のmalloc(512); // 512バイト 無料(P1); コンプレックス < int型 > * P2 = 新しい新しいコンプレックス< int型 >; // 一つのオブジェクト の削除P2; 無効 * P3 = :: 演算子 新新(512); // 512バイト :: オペレータ 削除(P3); // 次の使用アロケータのC ++標準ライブラリ。 // そのインターフェースは、標準ものの、しかし、商業用に完全に準拠を達成しませんでした。次の3つのフォームが最初に来ます。 _MSC_VERの#ifdef //次の2つの関数は、オブジェクトを呼び出すことによって与えられることに、非静的です。次の三つ分配INTS。 のInt * P4 =アロケータ< 整数 >()を割り当てる(。3。 、(INT *)0 ); アロケータ < INTを >()DEALLOCATE(P4、3。); #endifの #ifdefの__BORLANDC__ // 以下二つの関数はオブジェクトを呼び出すことによって与えられることに、非静的です。次の割り当て5つのINTS。 のInt * P4 =アロケータ< 整数 >()を割り当てる(5。); アロケータ < 整数 >()DEALLOCATE(P4 ,. 5 ); #endifの #ifdefの__GNUC__ //次の2つの関数は、完全な名前を呼び出すことによって取得することができ、静的です。次のバイトは512に割り当てられ // ボイド* P4 :: = ALLOC(512)を割り当てる; // ALLOC :: DEALLOCATE(p4,512); // 次の2つの関数は、オブジェクトを呼び出すを介して固定された、非静的です。次の割り当て7つのINTS。 ボイド * P4 =アロケータ< 整数 >()を割り当てる(7。); アロケータ < 整数 >()DEALLOCATE((のInt *)P4、7。); // 次の2つの関数は、非静的です、オブジェクトによって呼び出さする予定。次の割り当て9つのINTS。 ボイド * P5 = __gnu_cxx :: __ pool_alloc < 整数 >()を割り当てる(9 ); __gnu_cxx :: __ pool_alloc < 整数 >()DEALLOCATE((。INT *)P5、9 ); #endifの
達成するための新しいキーワード:
新しいは、最初の3つのステップにコンパイルされています。 コムコム* P新=(1,2); と等価: void *型演算子新しいMEM :: =(はsizeof(COM)); //メモリ割り当て のp = static_castを<コム*>(MEM); //キャスト のp>コム::コム(1,2) ; // そのほとんどのコンパイラに書かれたコンストラクタの呼び出し(自身がサポートしていませんが、実際には唯一のコンパイラ)は、Aの書き込みの実現を妨げます
私たちは、新しいメモリが実装オペレーター新機能()によって割り当てられていることを知っています。
図示のmallocが達成ように、オペレータは、新しい()関数は、実際に、頼るように実装されます。
new演算子()絶えず循環を呼び出すのmalloc()は、失敗した単語のためにメモリを割り当てる必要があります。
しかし、実際には別の操作がコール_callnewh(サイズ)に、この機能は私達によって上書きすることができますされています。
我々はメモリを解放することができると思う解除部、その後、次のmalloc関数はメモリを割り当てることができるようになります:何のmallocメモリの割り当ても、それを呼び出すないだろうとき、我々はように書き換えることができます。
new演算子()と同様に第二引数:デフォルトはエラーにとして与えられていませんが、あなた自身を指定することができます。
キーワードの実装を削除します:
図に示すように:デストラクタを呼び出し、削除最初に、その後、(delete演算子を使用))(メモリを解放し、そして実際には、単にオペレータ削除通話無料。