C++ダイナミックメモリ管理の理解:malloc/freeとnew/deleteの違いと関連


malloc/freeとnew/delete
同じ点:ダイナミックメモリの申請とメモリの解放に使用できます.申請したメモリはすべてスタックに割り当てられています.
異なる点:1、new/deleteはC++のオペレータであり、malloc/freeはCの関数である.2、newは2つのことをします.1つはメモリの割り当て、2つは呼び出しクラスの構造関数です.同様にdeleteはクラスの構造関数を呼び出し、メモリを解放します.mallocとfreeはメモリを割り当てて解放するだけです.3、newはオブジェクトを確立し、mallocはメモリを割り当てている.Newで確立されたオブジェクトは、メンバー関数でアクセスでき、アドレス空間に直接アクセスしないでください.mallocはメモリ領域を割り当て、ポインタでアクセスし、ポインタを移動することができます.newから出てくるポインタはタイプ情報を持ち,mallocはvoidポインタを返す.4、new/deleteは予約語で、ヘッダファイルのサポートは必要ありません.malloc/freeにはヘッダライブラリ関数のサポートが必要です.
連絡:new/deleteの機能がmalloc/freeを完全にカバーしている以上、なぜC++はmalloc/freeを保持しているのでしょうか.C++プログラムはC関数を呼び出すことが多いため、Cプログラムはmalloc/freeで動的メモリを管理するしかありません.freeで「newで作成したダイナミックオブジェクト」を解放すると、そのオブジェクトは構造関数を実行できないため、プログラムメモリの漏洩エラーを引き起こす可能性があります.deleteで「malloc申請のダイナミックメモリ」を解放すれば、理論的にはプログラムは間違っていませんが、プログラムの可読性は悪いです.
だからnew/delete、malloc/freeはペアで使用する必要があります.
例:
class Array
{
	public :
	Array(size_t size = 10)
		: _size(size)
		, _a(0)
	{
		cout << "Array(size_t size)" << endl;
		if (_size > 0)
		{
			_a = new int[size];
		}
	} ~
		Array()
	{
		cout << "~Array()" << endl;
		if (_a)
		{
			delete[] _a;
			_a = 0;
			_size = 0;
		}
	}
private:
	int*_a;
	size_t _size;
};
void Test()
{
	Array* p1 = (Array*)malloc(sizeof (Array));
	Array* p2 = new Array; Array* p3 = new Array(20);
	Array* p4 = new Array[10];
	free(p1);
	delete p2;
	delete p3;
	delete[] p4;
}