web-dev-qa-db-ja.com

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

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

関連(重複?): どのような場合にmalloc vs newを使用しますか?

274
MrDatabase

新規/削除

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

malloc/free

  • メモリの割り当て/解放
    1. 「ヒープ」から割り当てられたメモリ
    2. Void *を返します
    3. 失敗するとNULLを返します
    4. 必要なサイズをバイト単位で指定する必要があります。
    5. 配列を割り当てるには、スペースを手動で計算する必要があります。
    6. 単純なメモリの大きなチャンクの再割り当て(心配するコピーコンストラクタはありません)
    7. 彼らは ない 新規/削除を呼び出す
    8. 低メモリを支援するために、ユーザーコードを割り当てシーケンスにスプライスする方法はありません。
    9. malloc/free can ない 合法的にオーバーライドされる

機能の表比較:

 Feature                  | new/delete                     | malloc/free                   
--------------------------+--------------------------------+-------------------------------
 Memory allocated from    | 'Free Store'                   | 'Heap'                        
 Returns                  | Fully typed pointer            | void*                         
 On failure               | Throws (never returns NULL)    | Returns NULL                  
 Required size            | Calculated by compiler         | Must be specified in bytes    
 Handling arrays          | Has an explicit version        | Requires manual calculations  
 Reallocating             | Not handled intuitively        | Simple (no copy constructor)  
 Call of reverse          | Implementation defined         | No                            
 Low memory cases         | Can add a new memory allocator | Not handled by user code      
 Overridable              | Yes                            | No                            
 Use of (con-)/destructor | Yes                            | No                            

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

452
Martin York

最も関連する違いは、new演算子がメモリを割り当ててからコンストラクタを呼び出し、deleteがデストラクタを呼び出してからメモリを割り当て解除することです。

79
Trap

newはオブジェクトのctorを呼び出し、deleteはdtorを呼び出します。

mallocfreeは、生メモリを割り当てて解放するだけです。

29
James Curran

C++ではnew/deleteコンストラクター/デストラクターを適宜呼び出します。

malloc/freeは、単にヒープからメモリを割り当てます。 new/deleteもメモリを割り当てます。

13
Encryptic

new/deleteはC++です。malloc/freeは古き良きCに由来します。

C++では、newはオブジェクトコンストラクターを呼び出し、deleteはデストラクターを呼び出します。

オブジェクト指向の前の暗黒時代から来たmallocfreeは、オブジェクトのコードを実行せずに、メモリの割り当てと解放のみを行います。

12
Treb

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

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

実際、newは十分にカスタマイズ可能であるため、必ずしもヒープからメモリを返したり、メモリをまったく割り当てたりする必要はありません。ただし、デフォルトのnewは同じです。

10
Steve Jessop

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

他にも違いがあります:

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

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

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

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

  • mallocから派生した割り当ては、reallocを使用してサイズ変更できます。newから派生した割り当てはサイズ変更できません

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

違いを見ると、要約はmallocはC風、新しいはC++風です。コードベースに合ったものを使用してください。

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

6
Walter

newが行うことと、mallocがしないことのいくつかがあります。

  1. newは、そのオブジェクトのコンストラクターを呼び出してオブジェクトを構築します
  2. newは、割り当てられたメモリの型キャストを必要としません。
  3. メモリを割り当てる必要はありませんが、多くのオブジェクトを構築する必要があります。

したがって、mallocを使用する場合は、上記のことを明示的に行う必要がありますが、これは常に実用的ではありません。また、newはオーバーロードできますが、mallocはオーバーロードできません。

Wordでは、C++を使用する場合は、newをできるだけ使用するようにしてください。

5
herohuyongtao

また、

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

さらに多くの新規および削除は、タイプごとにオーバーライドできます。

4
DanJ

newおよびdeleteはC++ primitivesであり、クラスの新しいインスタンスを宣言するか、それを削除します(したがって、インスタンスのクラスのデストラクターを呼び出します)。

mallocおよびfreeはC 関数であり、メモリブロックを(サイズで)割り当ておよび解放します。

どちらもヒープを使用して割り当てを行います。 mallocfreeは、ポインターに関連付けられる可能性のあるメモリスペースのチャンクを予約するだけなので、より「低レベル」です。そのメモリの周囲に構造体は作成されません(C配列を構造体とみなさない限り)。

3
Jorge Córdoba

newおよびdeleteは、c ++の演算子です。過負荷になる可能性もあります。 mallocとfreeはcの関数です。

newが例外をスローしている間に失敗すると、mallocはnull ptrを返します。

mallocによって返されるアドレスは、(void *)malloc(size)Newを返すため、再度キャストされた型による必要があります。

2
VishalTiwari
  • newは演算子ですが、malloc()は関数です。
  • newは正確なデータ型を返し、malloc()はvoid *(void型のポインター)を返します。
  • malloc()、メモリは初期化されておらず、デフォルト値はガベージですが、新規の場合、メモリはintの場合の「ゼロ(0)」のようにデフォルト値で初期化されます。
  • deleteとfree()は両方とも 'NULL'ポインターに使用できます。
2
Anurag Singh
  • malloc()を使用するには、プログラム内でnewに不要なinclude<stdlib.h>または<alloc.h>が必要です。
  • newおよびdeleteはオーバーロードできますが、mallocはオーバーロードできません。
  • 配置newを使用して、メモリを割り当てたいアドレスを渡すことができますが、これはmallocの場合は不可能です。
1
ron davis

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
0
chirag kadam