1. ホーム
  2. c++

[解決済み】new/deleteとmalloc/freeの違いは何ですか?

2022-04-17 20:41:40

質問

とはどのような違いがあるのでしょうか? new / deletemalloc / free ?

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

どのように解決するのですか?

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. 以下のようになります。 しない コール new / delete .
    8. メモリ不足を解消するために、ユーザーコードを割り当てシーケンスに割り当てる方法がない。
    9. malloc / free NOT は合法的に上書きされます。

機能の表比較。

<テーブル 特徴 new / delete malloc / free メモリ割り当て元 'フリーストア' 'ヒープ' 戻り値 完全型ポインタ void* 失敗時 を投げる(決して返さない NULL ) 戻り値 NULL 必要なサイズ コンパイラで計算される バイト単位で指定する必要があります 配列の取り扱い 明示的なバージョンを持つ 手動で計算する必要がある 再割当 直感的に扱えない シンプル(コピーコンストラクタなし) リバース呼び出し 実装定義 いいえ メモリ不足の場合 新しいメモリアロケータを追加することができます ユーザーコードで処理されない オーバーライド可能 はい いいえ コンストラクタ/デストラクタの使用 はい いいえ

で確保されたメモリは、技術的には new が割り当てたメモリは「フリーストア」から来るのに対して malloc は「ヒープ」から来る。この2つの領域が同じかどうかは、実装の詳細であり、それがまた mallocnew を混在させることはできません。