new/delete と malloc/free の違いは何ですか? 質問する

new/delete と malloc/free の違いは何ですか? 質問する

new/deletemalloc/の違いは何ですかfree?

関連(重複?):どのような場合に malloc と new を使い分ければいいのでしょうか?

ベストアンサー1

new/delete

  • メモリの割り当て/解放
    1. 「フリーストア」から割り当てられたメモリ。
    2. 完全に型付けされたポインターを返します。
    3. new(標準バージョン) はNULL(失敗した場合はスローされます) を返すことはありません。
    4. Type-ID で呼び出されます (コンパイラがサイズを計算します)。
    5. 配列を明示的に処理するバージョンがあります。
    6. 再割り当て(より多くのスペースを取得するため)は直感的に処理されません(コピー コンストラクターのため)。
    7. malloc/を呼び出すかどうかはfree実装定義です。
    8. メモリ不足に対処するために新しいメモリアロケータを追加できます ( std::set_new_handler)。
    9. operator new/ はoperator delete合法的に上書きできます。
    10. オブジェクトの初期化/破棄に使用されるコンストラクタ/デストラクタ。

malloc/free

  • メモリの割り当て/解放
    1. 「ヒープ」から割り当てられたメモリ。
    2. を返しますvoid*
    3. 失敗した場合に戻りますNULL
    4. 必要なサイズをバイト単位で指定する必要があります。
    5. 配列を割り当てるには、スペースを手動で計算する必要があります。
    6. より大きなメモリチャンクの再割り当てが簡単 (コピーコンストラクターを気にする必要がない)。
    7. 彼らは/を呼びませnewdelete
    8. メモリ不足に対処するために、割り当てシーケンスにユーザー コードを組み込む方法はありません。
    9. malloc/ は合法的に上書きfreeできません。

機能の比較表:

特徴 new/delete malloc/free
割り当てられたメモリ 「フリーストア」 'ヒープ'
戻り値 完全に型付けされたポインタ void*
失敗時 スローします(戻りませんNULL 戻り値NULL
必要なサイズ コンパイラによって計算 バイト単位で指定する必要があります
配列の扱い 明示的なバージョンがある 手動計算が必要
再割り当て 直感的に操作できない シンプル(コピーコンストラクタなし)
逆の呼び出し 実装の定義 いいえ
メモリ不足の場合 新しいメモリアロケータを追加できる ユーザーコードでは処理されない
上書き可能 はい いいえ
コンストラクタ/デストラクタの使用 はい いいえ

技術的には、 によって割り当てられたメモリはnew「フリー ストア」から取得され、 によって割り当てられたメモリはmalloc「ヒープ」から取得されます。これら 2 つの領域が同じかどうかは実装の詳細であり、これがmallocnewを混在させることができないもう 1 つの理由です。

おすすめ記事