「new」と「malloc」、「calloc」と他の家族の違いは何ですか?
(いつ)「新しい」以外のものが必要ですか?
それらの1つは他を使用して実装されていますか?
new
およびdelete
はC++固有の機能です。それらはCには存在しませんでした。malloc
は古いCのやり方です。ほとんどの場合、C++で使用する必要はありません。
malloc
は、初期化されていないメモリを割り当てます。割り当てられたメモリは、free
で解放する必要があります。calloc
はmalloc
に似ていますが、割り当てられたメモリを定数(0)で初期化します。 free
で解放する必要があります。new
は、コンストラクター(オブジェクトの場合)を呼び出して、割り当てられたメモリを初期化します。 new
で割り当てられたメモリは、delete
(デストラクタを呼び出す)で解放する必要があります。必要なサイズを手動で指定し、適切なタイプにキャストする必要はありません。したがって、より現代的でエラーが発生しにくくなります。new/delete + new []/delete []:
malloc/free + family:
私の ここに関連する答え も参照してください
他の投稿が指摘しているように、malloc/freeはCと互換性があるC++の一部です。
次も参照してください: Stroustrup:new vs malloc
Newを使用すると、新しく割り当てられたメモリでコンストラクターが呼び出されます。割り当てられるものにコンストラクタがない場合、newはmallocと機能的に同じです。通常はそれを優先して使用する必要があります。
newはmallocの観点から実装される場合とされない場合があります。C++標準ではどちらのアプローチも必要ありません。
新しいもの以外は必要ありません。 C++のmallocの完全な代替品です。
違いについては、Mallocはメモリを割り当てるだけです。新しい割り当てられたメモリとコンストラクターを呼び出します。同様に、freeはメモリを解放するだけです。 Deleteはメモリを解放し、デストラクタを呼び出します。
警告の言葉:2つのイディオムを混同しないでください。結果は未定義です。
newとmallocの主な違いは、reallocを使用してnewによって割り当てられたメモリを再割り当てできないことです。したがって、メモリブロックのサイズを増減したい場合は、新しいブロックを割り当ててすべてをコピーする必要がありました。
Callocを使用すると、mallocではなく、割り当てるメモリブロックを初期化できます。
newオブジェクトの場合、オブジェクトのスペースが割り当てられるだけでなく、オブジェクトのコンストラクターが呼び出されます。しかし、これはC++の方法です。mallocは、メモリ割り当ての[〜#〜] c [〜#〜]の古いバージョンの方法です。 callocは、メモリをすべてのビットをゼロにクリアすることを除いて、mallocと同じです。