292

What is the difference between new/delete and malloc/free?

Related (duplicate?): In what cases do I use malloc vs new?

4

15 に答える 15

485

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 つの領域が同じかどうかは実装の詳細であり、これが混在できないもう 1 つmallocの理由です。new

于 2008-10-27T15:28:19.560 に答える
84

The most relevant difference is that the new operator allocates memory then calls the constructor, and delete calls the destructor then deallocates the memory.

于 2008-10-27T15:07:35.827 に答える
31

new calls the ctor of the object, delete call the dtor.

malloc & free just allocate and release raw memory.

于 2008-10-27T15:08:30.163 に答える
16

new/delete is C++, malloc/free comes from good old C.

In C++, new calls an objects constructor and delete calls the destructor.

malloc and free, coming from the dark ages before OO, only allocate and free the memory, without executing any code of the object.

于 2008-10-27T15:08:43.203 に答える
13

In C++ new/delete call the Constructor/Destructor accordingly.

malloc/free simply allocate memory from the heap. new/delete allocate memory as well.

于 2008-10-27T15:08:36.527 に答える
10

new と malloc の主な違いは、new がオブジェクトのコンストラクタを呼び出し、対応する delete の呼び出しがオブジェクトのデストラクタを呼び出すことです。

他にも違いがあります:

  • newタイプセーフであり、mallocタイプのオブジェクトを返しますvoid*

  • newエラー時に例外をスローし、errnoをmalloc返して設定しますNULL

  • newは演算子であり、オーバーロードできます。mallocは関数であり、オーバーロードできません

  • new[]配列を割り当てる は、より直感的で型安全ですmalloc

  • malloc-派生割り当ては を介し​​てサイズ変更できますがrealloc、 -new派生割り当てはサイズ変更できません

  • mallocNバイトのメモリチャンクを割り当てることができますnew。たとえば、char型の配列を割り当てるように要求する必要があります

違いを見てみると、malloc は C 風、new は C++ 風です。コードベースに適したものを使用してください。

new と malloc を異なるメモリ割り当てアルゴリズムを使用して実装することは合法ですが、ほとんどのシステムでは、new は malloc を使用して内部的に実装されるため、システム レベルの違いは生じません。

于 2014-10-08T08:52:34.953 に答える
10

唯一の類似点は、mallocどちらnewもヒープ上の一部のメモリをアドレス指定するポインタを返し、そのようなメモリ ブロックが返されると、最初に解放/削除しない限り、再び返されないことを保証することです。つまり、どちらもメモリを「割り当て」ます。

ただし、new/deleteは、コンストラクタ、デストラクタ、および演算子のオーバーロードを介して、さらに任意の他の作業を実行します。malloc/freeメモリの割り当てと解放のみを行います。

実際、newヒープからメモリを返す必要がなく、メモリをまったく割り当てなくても十分にカスタマイズできます。ただし、デフォルトnewはそうです。

于 2008-10-27T15:11:30.453 に答える
4

また、

グローバルなnewとdeleteはオーバーライドできますが、malloc/freeはオーバーライドできません。

さらに多くのnewとdeleteをタイプごとにオーバーライドできます。

于 2008-10-27T15:35:53.867 に答える
3

new and delete are C++ primitives which declare a new instance of a class or delete it (thus invoking the destructor of the class for the instance).

malloc and free are C functions and they allocate and free memory blocks (in size).

Both use the heap to make the allocation. malloc and free are nonetheless more "low level" as they just reserve a chunk of memory space which will probably be associated with a pointer. No structures are created around that memory (unless you consider a C array to be a structure).

于 2008-10-27T15:09:31.143 に答える
0
  • を使用するには、 プログラムにまたは を含めるmalloc()必要がありますが、これは には必要ありません。 <stdlib.h><alloc.h>new
  • newオーバーロードすることはできますが、deleteオーバーロードするmallocことはできません。
  • 配置を使用して、newメモリを割り当てたいアドレスを渡すことができますが、malloc.
于 2015-06-18T21:43:47.560 に答える
0

このコードは、delete キーワードまたは free 関数を使用するためのものです。ただし、「malloc」または「new」を使用してポインター オブジェクトを作成し、delete を使用してオブジェクト メモリの割り当てを解除すると、そのオブジェクト ポインターでもクラス内の関数を呼び出すことができます。その後、delete の代わりに free を使用すると、free ステートメントの後にも機能しますが、両方を使用すると、ポインター オブジェクトのみがクラス内の関数を呼び出すことができません。コードは次のとおりです。

#include<iostream>


using namespace std;

class ABC{
public: ABC(){
    cout<<"Hello"<<endl;
  }

  void disp(){
    cout<<"Hi\n";
  }

};

int main(){

ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();

cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}

出力:

Hello
Hi
0x2abfef37cc20
于 2017-11-12T10:27:43.577 に答える