56

new「 」と「malloc」と「 」と「 」と「 」の違いは何callocですか?

(いつ) 「 」以外に何か必要newですか?

それらの1つは他のものを使用して実装されていますか?

4

7 に答える 7

78

newおよびdeleteC++ 固有の機能です。それらは C にmallocは存在しませんでした。古い学校の C のやり方です。ほとんどの場合、C++ で使用する必要はありません。

  • malloc初期化されていないメモリを割り当てます。割り当てられたメモリは、で解放する必要がありfreeます。
  • callocに似mallocていますが、割り当てられたメモリを定数 (0) で初期化します。で解放する必要がありますfree
  • newコンストラクターを呼び出して、割り当てられたメモリを初期化します (オブジェクトの場合)。で割り当てられたメモリは、newで解放する必要がありますdelete(これにより、デストラクタが呼び出されます)。必要なサイズを手動で指定して、適切な型にキャストする必要はありません。したがって、より現代的でエラーが発生しにくくなっています。
于 2009-04-30T16:49:37.277 に答える
24

new/ delete+ new[]/ delete[]:

  • new/deleteは、メモリを割り当て、ヒープからメモリを解放する C++ の方法です。
  • new[]これは、delete[]連続したメモリの配列を割り当てる C++ の方法です。
  • より型安全であるため、使用する必要があります。malloc
  • コンストラクタ/デストラクタを呼び出すため、使用する必要があります
  • ある意味で使用することはできませんが、reallocplacement new を使用してデータの同じバッファーを再利用できます
  • でデータを割り当てたりnew、解放したりすることはできませfreeん。delete[]

malloc/ free+ 家族:

  • malloc/ free/family は、ヒープからメモリを割り当てて解放する C の方法です。
  • callocと同じですがmalloc、メモリも初期化します
  • メモリを再割り当てする必要がある場合に使用する必要があります
  • mallocdelete や delete[] でデータを割り当てたり解放したりすることはできません

ここで私の関連する回答も参照してください

于 2009-04-30T16:51:49.050 に答える
8
  • newctor (順序は指定されていません) を割り当てて呼び出しdelete、dtor を割り当てて、new の呼び出しによって割り当てられたメモリを解放します。
  • malloc一部のメモリのみを割り当て、freeによって割り当てられたメモリを削除しますmalloc
  • newを使用して実装できますmalloc(標準では必須ではありません)
  • callocと同じことをmalloc行い、新しく割り当てられたメモリをゼロ初期化します

他の投稿が指摘しているように: malloc/freeは C と互換性を持たせるために C++ の一部です。

参照: Stroustrup: new vs malloc

于 2009-04-30T16:51:01.220 に答える
6

新しいもの以外は必要ありません。これは、C++ の malloc を完全に置き換えるものです。

違いについては、 Malloc はメモリを割り当てるだけです。新しく割り当てられたメモリとコンストラクターの呼び出し。同様に、 free はメモリを解放するだけです。Delete はメモリを解放し、デストラクタを呼び出します。

警告の言葉: 2 つのイディオムを混同しないでください。結果は未定義です。

于 2009-04-30T16:51:54.010 に答える
5

new を使用すると、新しく割り当てられたメモリでコンストラクターが呼び出されます。割り当てられるものにコンストラクタがない場合、new は機能的に malloc と同じです。通常はそれを参照して使用する必要があります。

new は、malloc に関して実装される場合と実装されない場合があります。C++ 標準では、どちらの方法も必要ありません。

于 2009-04-30T16:50:04.170 に答える
2

私が思い出せる new と malloc の主な違いは、realloc を使用して new によって割り当てられたメモリを再割り当てできないことです。そのため、メモリ ブロックのサイズを増減したい場合は、新しいブロックを割り当ててすべてをコピーする必要がありました。

Calloc を使用すると、割り当てたメモリ ブロックを初期化できますが、malloc では初期化できません。

于 2009-04-30T16:51:30.453 に答える
1

オブジェクトを新規作成すると、オブジェクトのスペースが割り当てられるだけでなく、オブジェクトのコンストラクターが呼び出されます。しかし、これは C++ の方法であり、mallocはCでメモリを割り当てる古いバージョンの方法です。callocはmallocと同じですが、メモリをすべてのビット 0 にクリアする点が異なります。

于 2009-04-30T16:51:40.440 に答える