new、delete、malloc、freeの違い

まず、
newとdeleteはC ++キーワードであり、
mallocをサポートするにはコンパイラでサポートする必要があります。FreeはCのライブラリ関数であり、ヘッダーファイルが必要です。

同時に、
newメモリを開くときにデータ型に応じてメモリを自動的に割り当てます
が、手動で指定する必要はありませんが、mallocは必要なメモリのサイズを手動で指定する必要があります。

などメモリが正常に開かれた後、
新しい戻り値はオブジェクトポインタのタイプと一致し
、mallocは* voidを返します、人々はキャストが必要です

もちろん、失敗もある
のでテストする必要があります。
失敗した場合、
newはbad_alloc例外をスローし、
mallocはnullポインターを返します。
戻り値の違いに応じて、メモリが正常に開かれたかどうかを判断できます。

newの実装手順
1.最初に演算子newを使用してメモリスペースを開きます

2.クラスのコンストラクターを呼び出します

3.対応するポインタを返します

異なるクラスの場合、演算子newは、異なるものを実現するために複数回オーバーロードする必要があることがよくあります。

最後に、スタックとヒープおよびオブジェクトの作成Aa
およびA * p = new a:についての理解があります

栈是连续内存,由系统来控制,其内的数据执行完就自动删除

而A a就是静态建立对象,由系统直接在栈中开辟内存------移动栈指针,然后直接调用构造函数并在执行完后自动删除


堆是不连续内存,不受系统控制,其内的数据不会自动删除,容量较大
A *p =new a 则是动态建立对象,在堆中进行,先调用合适的operator new()函数来开辟内存空间,然后再调用函数的构造函数

mallocとfreeの両方がヒープ上で実行され、
newはmallocによってヒープ上で開かれたメモリであるため、自分で削除する必要があります。
ここで
、deleteの最下層が使用され、クラスのデストラクタが呼び出されます。最初に、次に空きを使用してメモリスペースを解放します

そうすると、両者の違いは次のように理解できます。

malloc,free只是单纯的对内存的开辟和释放,它不负责任何东西

而new和delete,会根据对象的不同,来进行构造和析构,并返回对应的指针类型

也就是说new是建立在c++面向对象的特性上建立的,更加完善的为对象服务的开辟以及删除内存的关键字

おすすめ

転載: blog.csdn.net/qq_43624038/article/details/114294174