2012-05-04 5 views
6

新しい演算子は、連続したヒープメモリを割り当てることを保証していますか?私。C++の新しい演算子 - メモリのレイアウト

objects=(Base*)malloc(1024*sizeof(base)); 

又はギャップが存在することができると同じメモリ割当ての観点

objects=new Base[1024]; 

ですか?

答えて

8

はい、メモリは連続しています。割り当てに関しては、mallocと同じですが、いくつかの相違点があります(コンストラクタへの呼び出し、newNULLを返しません。mallocは例外をスローしませんなど)。

deleteまたはfreeと混在させることはできませんので、メモリを解放するにはdelete[] objectsを使用する必要があります。

+0

全く同じではありません。 'new []'バージョンは各オブジェクトのデフォルトコンストラクタを呼び出します。 –

+1

@ edA-qamort-ora-yこれは私が言ったことです... –

+0

申し訳ありません、私は今日盲目です。しかし、新しいバージョンでは、配列のサイズを記憶するために少し余分なスペースが割り当てられるので、 'delete []'は正しい数のデストラクタを呼び出すことができます。もちろん、それは空間の小さな違いです。 –

3

多分。 new演算子は、operator new関数を呼び出します。これは連続したメモリブロックを返し、可能なすべての型に対して適切に整列されます(ただし、そうでない場合を除き、新しい誤った配置など)。次に、オブジェクトのコンストラクタを呼び出します。オブジェクトのコンストラクタは、何かを行うことができます。最初のブロックと連続しない追加のブロックを割り当てることを含みます。

0

new演算子がオーバーロードされていない場合、割り当てられたメモリブロックは連続しています。しかし、それが過負荷になると、私たちは知ることができません(いくつかの邪悪なプログラマーがそれを過負荷にしているかもしれません):