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はペアで使用する必要があります.
例:
同じ点:ダイナミックメモリの申請とメモリの解放に使用できます.申請したメモリはすべてスタックに割り当てられています.
異なる点: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;
}