回答:
機能の表比較:
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によって割り当てられたメモリは「フリーストア」から、mallocによって割り当てられたメモリは「ヒープ」から取得されます。これら2つの領域が同じであるかどうかは、実装の詳細です。これが、mallocとnewを混合できないもう1つの理由です。
If ptr is NULL, no operation is performed.
new
オペレーターはフリーストアからメモリを割り当てます(ダイナミックメモリとしても知られています)そして、ヒープ)ザ・C ++ 14標準、上のセクション3.7.4。ダイナミックストレージは、「オブジェクトが新表現(5.3.4)を使用して、プログラムの実行(1.9)中に動的に作成、および削除式を使用して破壊することができます。」と言う
最も重要な違いは、new
演算子がメモリを割り当ててからコンストラクタをdelete
呼び出し、デストラクタを呼び出してメモリの割り当てを解除することです。
new
オブジェクトdelete
のctorを呼び出し、dtorを呼び出します。
malloc
&free
そのままのメモリを割り当てて解放します。
new
/ delete
はC ++であり、malloc
/ free
は古き良きCに由来します。
C ++では、new
オブジェクトコンストラクターをdelete
呼び出し、デストラクターを呼び出します。
malloc
そしてfree
、OO前暗黒年代からの、唯一のオブジェクトの任意のコードを実行することなく、メモリを割り当て、解放します。
唯一の類似点はそれですmalloc
/new
両方がヒープ上の一部のメモリをアドレス指定するポインタを返すことであり、どちらも、このようなメモリブロックが返されると、最初に解放/削除しない限り、再び返されないことを保証します。つまり、どちらもメモリを「割り当て」ます。
ただし、new
/ delete
コンストラクタ、デストラクタ、および演算子のオーバーロードを介して、さらに他の任意の作業を実行します。malloc
/free
メモリの割り当てと解放のみを行います。
実際、new
は十分にカスタマイズ可能であり、必ずしもヒープからメモリを返したり、メモリを割り当てたりする必要はありません。ただし、デフォルトでnew
はそうです。
newとmallocの主な違いは、newがオブジェクトのコンストラクターを呼び出し、それに対応するdeleteの呼び出しがオブジェクトのデストラクターを呼び出すことです。
他の違いがあります:
new
タイプセーフであり、malloc
タイプのオブジェクトを返しますvoid*
new
エラー時に例外をスローし、errnoをmalloc
返しNULL
て設定します
new
演算子であり、オーバーロード可能でmalloc
あり、関数であり、オーバーロードできません
new[]
配列を割り当てるは、より直感的でタイプセーフです。 malloc
malloc
由来の割り当てを介してサイズ変更することができrealloc
、new
由来割り当てをリサイズすることができません
malloc
Nバイトのメモリチャンクを割り当てることができますnew
。たとえば、char
型の配列を割り当てるように要求する必要があります
違いを見ると、要約はmallocがC-esqueで、新しいのはC ++-esqueです。コードベースに適したものを使用してください。
newとmallocを異なるメモリ割り当てアルゴリズムを使用して実装することは正当ですが、ほとんどのシステムでは、newは内部的にmallocを使用して実装されており、システムレベルの違いはありません。
new
およびクラスの新しいインスタンスを宣言または削除するdelete
C ++ プリミティブです(したがって、インスタンスのクラスのデストラクタを呼び出します)。
malloc
そしてfree
C 関数ですあり、メモリブロックを割り当てて解放します(サイズ)。
どちらもヒープを使用して割り当てを行います。malloc
そしてfree
、彼らはただ、おそらくポインタに関連付けされるメモリ空間のチャンクを確保して、それにもかかわらず、より「低レベル」です。そのメモリの周りに構造は作成されません(C配列を構造と見なさない限り)。
削除キーワードまたはフリー関数を使用するためのこのコード。ただし、「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