百度筆記試験問題:malloc/freeとnew/deleteの違い

4633 ワード

同じ点:ダイナミックメモリの申請とメモリの解放に使用できます.
相違点:(1)操作対象が異なる.mallocとfreeはC++/C言語の標準ライブラリ関数であり、new/deleteはC++の演算子である.内部データクラス以外のオブジェクトでは、maloc/freeだけではダイナミックオブジェクトの要件を満たすことはできません.オブジェクトは作成と同時にコンストラクション関数を自動的に実行し、オブジェクトが消滅する前にコンストラクション関数を自動的に実行します.malloc/freeは演算子ではなくライブラリ関数であるため、コンパイラ制御権限内ではなく、コンストラクション関数とコンストラクション関数を実行するタスクをmalloc/freeに押し付けることはできません.
(2)使い方も違います.関数mallocのプロトタイプは、void*malloc(size_t size);長さlengthの整数タイプのメモリをmallocで申請します.プログラムはint*p=(int*)malloc(sizeof(int)*length)です.「タイプ変換」と「sizeof」の2つの要素に集中しなければならない.1、mallocの戻り値のタイプはvoid*であるため、mallocを呼び出す際に明示的にタイプ変換を行い、void*を必要なポインタタイプに変換する.2、malloc関数自体は、申請するメモリのタイプを認識せず、メモリの総バイト数にのみ関心を持っています.関数freeの原型は以下の通りである:void free(void*memblock);なぜfree関数はmalloc関数ほど複雑ではないのでしょうか.これは,ポインタpのタイプとその指すメモリの容量が事前に知られており,文free(p)がメモリを正しく解放できるからである.pがNULLポインタの場合、free対pは何度操作しても問題ありません.pがNULLポインタでない場合、freeがpを2回連続して操作するとプログラムの実行エラーが発生します.
新/deleteの使用要点:演算子newは関数mallocよりずっと簡単です.例えば、int*p 1=(int*)malloc(sizeof(int)*length);int *p2 = new int[length]; これはnewにsizeof、タイプ変換、タイプセキュリティチェック機能が内蔵されているためです.内部データ型以外のオブジェクトでは、newは動的オブジェクトを作成しながら初期化を完了します.オブジェクトに複数のコンストラクション関数がある場合、newの文にも複数の形式があります.newでオブジェクト配列を作成する場合は、オブジェクトのパラメータなしコンストラクション関数しか使用できません.例えばObj*objects=new Obj[100];//100個の動的オブジェクトを作成するには、Obj*objects=new Obj[100](1);//100個のダイナミックオブジェクトを作成しながら初期値1を付与deleteでオブジェクト配列を解放するときは、シンボル'[]'を失わないように注意します.例えばdelete[]objects;//正しい使い方delete objects;//誤った使い方後者はdelete objects[0]に相当し、他の99のオブジェクトが漏れています.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1、newは自動的に割り当てる空間を計算し、mallocはバイト数を手動で計算する必要がある2、newはタイプが安全であるが、mallocはそうではない.例えば、int*p=new float[2];//コンパイル時にエラーint*p=malloc(2*sizeof(float);//コンパイル時にエラーを指摘できないnew operatorは、operator newとconstruct 3、operator newがmallocに対応する2つのステップで構成されていますが、operator newはリロードでき、メモリ割り当てポリシーをカスタマイズでき、メモリ割り当てを行わず、非メモリデバイスに割り当てることもできます.mallocは何もできません4、newはconstructorを呼び出しますが、mallocはできません.deleteはdestructorを呼び出しますがfreeはできません.5、malloc/freeはライブラリファイルのサポートを必要とし、new/deleteは不要です.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1、本質的な区別malloc/freeはC/C++言語の標準ライブラリ関数であり、new/deleteはC++の演算子である.ユーザーがカスタマイズしたオブジェクトでは、maloc/freeではオブジェクトを動的に管理する要件を満たすことはできません.オブジェクトは作成と同時にコンストラクション関数を自動的に実行し、オブジェクトは消滅する前にコンストラクション関数を自動的に実行します.malloc/freeは演算子ではなくライブラリ関数であるため、コンパイラ制御権限内ではなく、コンストラクション関数とコンストラクション関数を実行するタスクをmalloc/freeに押し付けることはできません.したがって、C++には、動的メモリ割り当てと初期化作業を完了できる演算子newと、メモリのクリーンアップと解放作業を完了できる演算子deleteが必要です.
class Obj
{
public:
	Obj( ) 
	{ cout  <<  "Initialization"  <<  endl; }
	~ Obj( )
	{ cout  <<  "Destroy" <<  endl; }
	void Initialize( )
	{ cout  <<  "Initialization"  <<  endl; }
	void  Destroy( )
	{ cout  <<  "Destroy"  <<  endl; }
}obj;

void  UseMallocFree( )
{
	Obj   * a  =  (Obj  *) malloc( sizeof ( obj ) );      //  allocate memory 
	a -> Initialize();                                    //  initialization
	// … 
	a -> Destroy();                                        // deconstruction 
	free(a);                                               // release memory
}

void  UseNewDelete( void )
{
	Obj   * a  =   new  Obj;                                           
	// … 
	delete a; 
}

クラスObjの関数Initializeは構造関数の機能を実現し,関数Destroyは構造関数の機能を実現した.関数UseMallocFreeでは、malloc/freeではコンストラクション関数とコンストラクション関数を実行できないため、メンバー関数InitializeとDestroyを呼び出してコンストラクションとコンストラクションを完了する必要があります.したがって、malloc/freeを使用してダイナミックオブジェクトのメモリ管理を完了するのではなく、new/deleteを使用する必要があります.内部データ型の「オブジェクト」には、malloc/freeおよびnew/deleteは構造および解析のプロセスがないため、等価です.
2、連絡new/deleteの機能がmalloc/freeを完全にカバーしている以上、なぜC++はmalloc/freeを保持しているのか.C++プログラムはC関数を呼び出すことが多いため、Cプログラムはmalloc/freeで動的メモリを管理するしかありません.freeで「newで作成したダイナミックオブジェクト」を解放すると、そのオブジェクトは構造関数を実行できないため、プログラムエラーを引き起こす可能性があります.deleteで「malloc申請のダイナミックメモリ」を解放すれば、理論的にはプログラムは間違っていませんが、プログラムの可読性は悪いです.したがってnew/delete、malloc/freeはペアで使用する必要があります.