malloc/free VS new/delete

5843 ワード

1.mallocとnew
mallocとfreeはC++/C言語の標準ライブラリ関数であり、new/deleteはC++の演算子であり、動的メモリの申請とメモリの解放に使用できます.内部データ型以外のオブジェクトでは、maloc/freeだけではダイナミックオブジェクトの要件を満たすことはできません.オブジェクトは作成と同時に構造関数を自動的に実行し、オブジェクトは消滅する前に構造関数を自動的に実行します.malloc/freeは演算子ではなくライブラリ関数であるため、コンパイラ制御権限内ではなく、構造関数と構造関数を実行するタスクをmalloc/freeに押し付けることはできません.したがって、C++言語には、動的メモリ割り当てと初期化作業を完了できる演算子newと、メモリのクリーンアップと解放作業を完了できる演算子deleteが必要です.(new/deleteはライブラリ関数ではないことに注意してください.)メモリリークはmallocまたはnewに対してチェックできます.違いは、newがそのファイルの行を示すことができ、mallocにはこれらの情報がありません.
2.malloc/freeとnew/deleteがオブジェクトのダイナミックメモリ管理をどのように実現するか
 1 class Obj
 2 {
 3 public :
 4   Obj(void){ cout << “Initialization” << endl; }
 5   ~Obj(void){ cout << “Destroy” << endl; }
 6 
 7   void Initialize(void){ cout << “Initialization” << endl; }
 8 
 9   void Destroy(void){ cout << “Destroy” << endl; }
10 };
11 
12 void UseMallocFree(void)
13 {
14   Obj *a = (obj *)malloc(sizeof(obj)); //       
15   a->Initialize(); //    
16 
17   //
18 
19   a->Destroy(); //     
20   free(a); //     
21 }
22 
23 void UseNewDelete(void)
24 {
25   Obj *a = new Obj; //            
26 
27   //
28 
29   delete a; //         
30 }

クラスObjのInitialize関数は構造関数の機能をシミュレートし,Destroy関数は構造関数の機能をシミュレートした.関数UseMallocFreeでは、malloc/freeではコンストラクション関数と解析関数を実行できないため、メンバー関数InitializeとDestroyを呼び出して初期化とパージを完了する必要があります.関数UseNewDeleteはずっと簡単です.したがって、malloc/freeを使用してダイナミックオブジェクトのメモリ管理を完了しようとしないで、new/deleteを使用します.内部データ型の「オブジェクト」には、malloc/freeおよびnew/deleteは構造および解析のプロセスがないため、等価です.
new/deleteの機能がmalloc/freeを完全にカバーしている以上、なぜC++はmalloc/freeを淘汰しないのでしょうか.これは、C++プログラムがC関数を呼び出すことが多いためです.Cプログラムはmalloc/freeで動的メモリを管理するしかありません.freeで「newで作成したダイナミックオブジェクト」を解放すると、そのオブジェクトは構造関数を実行できないため、プログラムエラーを引き起こす可能性があります.deleteで「malloc申請のダイナミックメモリ」を解放すれば、理論的にはプログラムは間違っていませんが、プログラムの可読性は悪いです.だからnew/deleteはペアで使用しなければなりません.malloc/freeも同じです.
参考資料:http://blog.sina.com.cn/s/blog_729813290100xeqt.html
***************************************************************************************************************************
以下の内容は『高品質C++/Cプログラミングガイド』から抜粋する.mallocとfreeはC++/C言語の標準ライブラリ関数であり、new/deleteはC++の演算子である.ダイナミックメモリの申請やメモリの解放に使用できます.2.内部データ型以外のオブジェクトでは、malloc/freeだけではダイナミックオブジェクトの要件を満たすことができません.オブジェクトは作成と同時にコンストラクション関数を自動的に実行し、オブジェクトは消滅する前にコンストラクションを自動的に実行します.
で行ないます.malloc/freeは演算子ではなくライブラリ関数であるため、コンパイラ制御権限内ではなく、コンストラクション関数とコンストラクション関数を実行するタスクをmalloc/freeに押し付けることはできません.3.C++言語では、動的メモリ割り当てと初期化作業を完了できる演算子newが必要であり、メモリのクリーンアップと解放作業を完了できる演算子deleteが必要です.注意new/deleteはライブラリ関数ではありません.4.C++プログラムはC関数を呼び出すことが多いが、Cプログラムはmalloc/freeで動的メモリを管理するしかない.
つまり、
newはオペレータで、何と「+」、「-」、「=」...同じ地位にある.mallocはメモリを割り当てる関数で、呼び出すことができます.newは予約字で、ヘッダファイルのサポートは必要ありません.mallocにはヘッダライブラリ関数のサポートが必要です.
newはオブジェクトを構築します.mallocはメモリを割り当てます.newが確立したオブジェクトは、通常のオブジェクトとして、メンバー関数でアクセスし、アドレス空間に直接アクセスしないでください.mallocはメモリ領域を割り当てており、ポインタでアクセスし、ポインタを移動することもできます.