new
/delete
とmalloc
/の違いは何ですかfree
?
ベストアンサー1
new
/delete
- メモリの割り当て/解放
- 「フリーストア」から割り当てられたメモリ。
- 完全に型付けされたポインターを返します。
new
(標準バージョン) はNULL
(失敗した場合はスローされます) を返すことはありません。- Type-ID で呼び出されます (コンパイラがサイズを計算します)。
- 配列を明示的に処理するバージョンがあります。
- 再割り当て(より多くのスペースを取得するため)は直感的に処理されません(コピー コンストラクターのため)。
malloc
/を呼び出すかどうかはfree
実装定義です。- メモリ不足に対処するために新しいメモリアロケータを追加できます (
std::set_new_handler
)。 operator new
/ はoperator delete
合法的に上書きできます。- オブジェクトの初期化/破棄に使用されるコンストラクタ/デストラクタ。
malloc
/free
- メモリの割り当て/解放
- 「ヒープ」から割り当てられたメモリ。
- を返します
void*
。 - 失敗した場合に戻ります
NULL
。 - 必要なサイズをバイト単位で指定する必要があります。
- 配列を割り当てるには、スペースを手動で計算する必要があります。
- より大きなメモリチャンクの再割り当てが簡単 (コピーコンストラクターを気にする必要がない)。
- 彼らは/を呼びません。
new
delete
- メモリ不足に対処するために、割り当てシーケンスにユーザー コードを組み込む方法はありません。
malloc
/ は合法的に上書きfree
できません。
機能の比較表:
特徴 | new /delete |
malloc /free |
---|---|---|
割り当てられたメモリ | 「フリーストア」 | 'ヒープ' |
戻り値 | 完全に型付けされたポインタ | void* |
失敗時 | スローします(戻りませんNULL ) |
戻り値NULL |
必要なサイズ | コンパイラによって計算 | バイト単位で指定する必要があります |
配列の扱い | 明示的なバージョンがある | 手動計算が必要 |
再割り当て | 直感的に操作できない | シンプル(コピーコンストラクタなし) |
逆の呼び出し | 実装の定義 | いいえ |
メモリ不足の場合 | 新しいメモリアロケータを追加できる | ユーザーコードでは処理されない |
上書き可能 | はい | いいえ |
コンストラクタ/デストラクタの使用 | はい | いいえ |
技術的には、 によって割り当てられたメモリはnew
「フリー ストア」から取得され、 によって割り当てられたメモリはmalloc
「ヒープ」から取得されます。これら 2 つの領域が同じかどうかは実装の詳細であり、これがmalloc
とnew
を混在させることができないもう 1 つの理由です。