new/delete 與 malloc/free 的區別是什麼?

先上區別:
    1. new/delete是C++裏纔有的,而new/delete與malloc/free一個顯著的區別在於,new是建造一個對象,並調用對象的構造函數來初始化對象,其實在所有的new操作過程中,總是分爲兩步的:第一步是申請內存,第二步則是調用構造函數初始化對象。同樣,在調用delete的時候,需要先調用析構函數,然後在銷燬堆內存。
    2. new/delete通常來說是操作符,就是"+","-"一樣,而malloc/free是庫函數。 
    3. new/delete是可以重載的,而重載之後,就成爲了函數。 
    4. malloc在申請內存的時候,必須要提供申請的長度,而返回的指針是void*型,必須要強轉才能成爲需要的類型。
    5. 當new/delete在類中被重載的時候,可以自定義申請過程,比如記錄所申請內存的總長度,以及跟蹤每個對象的指針。 
    6. C++默認的new/delete操作符內部,其實也調用了malloc/free這兩個函數。
共同點:
    1. 都必須配對使用,這裏的配對使用,可不能理解爲一個new/malloc就對應一個delete/free,而是指在作用域內,new/malloc所申請的內存,必須被有效釋放,否則將會導致內存泄露。
    2. 都是申請內存,釋放內存,free和delete可以釋放NULL指針。
注意點:

    1. new/delete與malloc/free不能混合使用,有些人對這個觀點持懷疑態度,因爲在很多時候,他混合使用之後也沒有嚴重的後遺症,那是因爲在通常情況下,new操作符的確調用了malloc這個函數,所以free函數可以正常的釋放new出來的內存空間。但這並不能保證所有的new操作符都是調用C++的new的原始操作符,而最常見的是,在類中,我們是可以重載new這個操作符的,這樣的話,如果一但在operator=new()函數中調用了其它的申請函數的話東西,free將無法正常工作,或者說也將導致內存泄露。

內容來自CSDN博客  jerry4711的專欄  (如有侵權,刪!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章