new
/delete
とmalloc
/free
の違いは何ですか?
関連(重複?): どのような場合にmalloc vs newを使用しますか?
機能の表比較:
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つの理由です。
最も関連する違いは、new
演算子がメモリを割り当ててからコンストラクタを呼び出し、delete
がデストラクタを呼び出してからメモリを割り当て解除することです。
new
はオブジェクトのctorを呼び出し、delete
はdtorを呼び出します。
malloc
&free
は、生メモリを割り当てて解放するだけです。
C++ではnew
/delete
コンストラクター/デストラクターを適宜呼び出します。
malloc
/free
は、単にヒープからメモリを割り当てます。 new
/delete
もメモリを割り当てます。
new
/delete
はC++です。malloc
/free
は古き良きCに由来します。
C++では、new
はオブジェクトコンストラクターを呼び出し、delete
はデストラクターを呼び出します。
オブジェクト指向の前の暗黒時代から来たmalloc
とfree
は、オブジェクトのコードを実行せずに、メモリの割り当てと解放のみを行います。
唯一の類似点は、malloc
/new
の両方がヒープ上のメモリをアドレス指定するポインターを返すことであり、両方とも、そのようなメモリーのブロックが返されると、最初に解放/削除しない限り、再び返されないことを保証します。つまり、どちらもメモリを「割り当て」ます。
ただし、new
/delete
は、コンストラクタ、デストラクタ、および演算子のオーバーロードを介して、さらに他の任意の作業を実行します。 malloc
/free
は、メモリの割り当てと解放のみを行います。
実際、new
は十分にカスタマイズ可能であるため、必ずしもヒープからメモリを返したり、メモリをまったく割り当てたりする必要はありません。ただし、デフォルトのnew
は同じです。
Newとmallocの主な違いは、newがオブジェクトのコンストラクターを呼び出し、対応するdeleteの呼び出しがオブジェクトのデストラクターを呼び出すことです。
他にも違いがあります:
new
はタイプセーフであり、malloc
はタイプvoid*
のオブジェクトを返します
new
はエラー時に例外をスローし、malloc
はNULL
を返し、errnoを設定します
new
は演算子であり、オーバーロードできます。malloc
は関数であり、オーバーロードできません
配列を割り当てるnew[]
は、malloc
よりも直感的で型安全です。
malloc
から派生した割り当ては、realloc
を使用してサイズ変更できます。new
から派生した割り当てはサイズ変更できません
malloc
はNバイトのメモリチャンクを割り当てることができます。new
は、たとえばchar
タイプの配列を割り当てるように要求する必要があります
違いを見ると、要約はmallocはC風、新しいはC++風です。コードベースに合ったものを使用してください。
Newとmallocを異なるメモリ割り当てアルゴリズムを使用して実装することは正当ですが、ほとんどのシステムでは、newはmallocを使用して内部的に実装され、システムレベルの違いはありません。
new
が行うことと、malloc
がしないことのいくつかがあります。
new
は、そのオブジェクトのコンストラクターを呼び出してオブジェクトを構築しますnew
は、割り当てられたメモリの型キャストを必要としません。したがって、malloc
を使用する場合は、上記のことを明示的に行う必要がありますが、これは常に実用的ではありません。また、new
はオーバーロードできますが、malloc
はオーバーロードできません。
Wordでは、C++を使用する場合は、new
をできるだけ使用するようにしてください。
また、
グローバルのnewおよびdeleteはオーバーライドできますが、malloc/freeはオーバーライドできません。
さらに多くの新規および削除は、タイプごとにオーバーライドできます。
new
およびdelete
はC++ primitivesであり、クラスの新しいインスタンスを宣言するか、それを削除します(したがって、インスタンスのクラスのデストラクターを呼び出します)。
malloc
およびfree
はC 関数であり、メモリブロックを(サイズで)割り当ておよび解放します。
どちらもヒープを使用して割り当てを行います。 malloc
とfree
は、ポインターに関連付けられる可能性のあるメモリスペースのチャンクを予約するだけなので、より「低レベル」です。そのメモリの周囲に構造体は作成されません(C配列を構造体とみなさない限り)。
newおよびdeleteは、c ++の演算子です。過負荷になる可能性もあります。 mallocとfreeはcの関数です。
newが例外をスローしている間に失敗すると、mallocはnull ptrを返します。
mallocによって返されるアドレスは、(void *)malloc(size)Newを返すため、再度キャストされた型による必要があります。
malloc()
を使用するには、プログラム内でnew
に不要なinclude<stdlib.h>
または<alloc.h>
が必要です。new
およびdelete
はオーバーロードできますが、malloc
はオーバーロードできません。new
を使用して、メモリを割り当てたいアドレスを渡すことができますが、これはmalloc
の場合は不可能です。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