malloc/freeがあったらどうしてnew/deleteするの?



malloc/freeがあったらどうしてnew/deleteするの?
mallocとfreeはC++/C言語の標準ライブラリ関数であり、new/deleteはC++の演算子である.ダイナミックメモリの申請やメモリの解放に使用できます.
内部データ型以外のオブジェクトでは、maloc/freeだけではダイナミックオブジェクトの要件を満たすことはできません.オブジェクトは作成と同時にコンストラクション関数を自動的に実行し、オブジェクトは消滅する前にコンストラクション関数を自動的に実行します.malloc/freeは演算子ではなくライブラリ関数であるため、コンパイラ制御権限内ではなく、コンストラクション関数とコンストラクション関数を実行するタスクをmalloc/freeに押し付けることはできません.
したがって、C++言語には、動的メモリ割り当てと初期化作業を完了できる演算子newと、メモリのクリーンアップと解放作業を完了できる演算子deleteが必要です.注意new/deleteはライブラリ関数ではありません.
まず、malloc/freeおよびnew/deleteがオブジェクトの動的メモリ管理をどのように実現するかを見てみましょう.例7-8を参照してください.
 
class Obj { public :         Obj(void){ cout << “Initialization” << endl; } ~Obj(void){ cout << “Destroy” << endl; } void    Initialize(void){ cout << “Initialization” << endl; } void    Destroy(void){ cout << “Destroy” << endl; } };
void UseMallocFree(void){Obj*a=(obj*)malloc(sizeof(obj));//ダイナミックメモリa->Initialize()//初期化//...a->Destroy()//作業free(a)//メモリの解放}
void UseNewDelete(void){Obj*a=new Obj;//動的メモリを申請して//...delete a;//メモリをクリアして解放する}
例7-8 malloc/freeとnew/deleteでオブジェクトのダイナミックメモリ管理をどのように実現するか
 
クラス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も同じです.
作者Blog:http://blog.csdn.net/forestassure/
もう一つのブログ:
mallocもnewもメモリスペースを申請する関数ですが、割り当て方には大きな違いがあります.
まずmalloc関数のプロトタイプを見てみましょう.extern void *malloc(unsigned int num_bytes)
num_を割り当てる機能ですbytesバイトサイズのメモリは、割り当てに成功した場合に割り当てられたメモリへのポインタを返し、そうでない場合は空のポインタNULLを返します.のリリースメモリの関数はfree()です.上の関数のプロトタイプから分かるように、mallocの戻りタイプはvoid*であるため、malloc関数を使用する場合、強制的に実際のタイプのポインタに変換する必要がある.
intのメモリスペースを申請します.newとmallocの使用方法はそれぞれ次のとおりです.int *p;
p = new int;

またはint *p;
p = (int *) malloc(sizeof(int));

上の使い方から2つの違いがわかります.
mallocの戻り値タイプはvoid*なので、強制変換で実際のタイプに変換する必要があります.newは必要ありません.
mallocは割り当てられたメモリサイズを設定する必要がありますが、newは必要ありません.
実際には、メモリの割り当て方にも大きな違いがあります.
malloc関数の本質は、使用可能なメモリブロックを長いリストに接続するいわゆる空きチェーンテーブルにある.malloc関数を呼び出すと、接続テーブルに沿ってユーザー要求を満たすのに十分なメモリブロックを探します.次に、メモリブロックを2つに分割します(1つのブロックのサイズはユーザーが要求したサイズと等しく、もう1つのブロックのサイズは残りのバイトです).次に、ユーザに割り当てられたメモリをユーザに渡し、残りのメモリ(ある場合)を接続テーブルに戻します.free関数を呼び出すと、ユーザが解放したメモリブロックが空きチェーンに接続されます.最後に、空きチェーンは多くの小さなメモリフラグメントに切断されます.この場合、ユーザーが大きなメモリフラグメントを申請すると、空きチェーンにはユーザーの要求を満たすフラグメントがない可能性があります.そこでmalloc関数は遅延を要求し,空きチェーン上で各メモリフラグメントを箱をひっくり返してチェックし始め,それらを整理し,隣接する小さな空きブロックを大きなメモリブロックに統合する.
もう一つ、mallocとfreeは一致しています.newとdeleteは一致しており,混同してはならない.
mallocもnewもスペースを申請しますが、newは強いタイプの割り当てで、オブジェクトのコンストラクション関数を呼び出してオブジェクトを初期化しますが、mallocはメモリスペースのみを割り当てますが初期化しません.freeは確かにオブジェクトのメモリを解放しますが、オブジェクトの構造関数は呼び出されません.deleteはオブジェクトのメモリを解放するだけでなく、オブジェクトの構造関数を呼び出すので、オブジェクトからfreeでnewで作成したオブジェクトを削除すると、メモリが漏れる可能性があります.
newとmallocはいずれも申請メモリであるが、申請の位置が異なり、newのメモリはfree storeから割り当てられ、mallocのメモリはheapから分けられ、free storeとheapはよく似ており、動的メモリであるが、位置が異なるのは、newから出てきたメモリがfreeで解放されない理由である.
作成者:http://blog.jwliu.com/2010/07/mallocnew.html