日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

new/delete和malloc/free的区别

發布時間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 new/delete和malloc/free的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

還是先說說區別吧:
??? 1. new/delete是C++里才有的,而new/delete與malloc/free一個顯著的區別在于,new是建造一個對象,并調用對象的構造函數來初始化對象,其實在所有的new操作過程中,總是分為兩步的:第一步是申請內存,第二步則是調用構造函數初始化對象。同樣,在調用delete的時候,需要先調用析構函數,然后在銷毀堆內存。
??? 2. new/delete通常來說是操作符,就是"+","-"一樣。
??? 3. new/delete是可以重載的,而重載之后,就成為了函數。
??? 4. malloc在申請內存的時候,必須要提供申請的長度,而返回的指針是void*型,必須要強轉才能成為需要的類型。
??? 5. 當new/delete在類中被重載的時候,可以自定義申請過程,比如記錄所申請內存的總長度,以及跟蹤每個對象的指針。
??? 6. C++默認的new/delete操作符內部,其實也調用了malloc/free這兩個函數。
共同點:
??? 1. 都必須配對使用,這里的配對使用,可不能理解為一個new/malloc就對應一個delete/free,而是指在作用域內,new/malloc所申請的內存,必須被有效釋放,否則將會導致內存泄露,至于內存泄露的檢查方法,我們推薦的工具是大家眾所周知的BoundsChecker,至于如何使用BoundsChecker,我們將在以后撰文詳解。
??? 2. 都是申請內存,釋放內存,free和delete可以釋放NULL指針。
注意點:
??? 1. new/delete與malloc/free不能混合使用,有些人對這個觀點持懷疑態度,因為在很多時候,他混合使用之后也沒有嚴重的后遺癥,那是因為在通常情況下,new操作符的確調用了malloc這個函數,所以free函數可以正常的釋放new出來的內存空間。但這并不能保證所有的new操作符都是調用C++的new的原始操作符,而最常見的是,在類中,我們是可以重載new這個操作符的,這樣的話,如果一但在operator=new()函數中調用了其它的申請函數的話東西,free將無法正常工作,或者說也將導致內存泄露。

舉幾個簡單的例子吧:

class CTest
{
public:
??? CTest();
??? ~CTest();

private:
??? int* __m_pn;
};

CTest::CTest()
{
??? __m_pn = new int[128]; assert(__m_pn);
}

CTest::~CTest()
{
??? assert(__m_pn);
??? delete[] __m_pn;
??? __m_pn = NULL;
}

int main()
{
??? int* pn = (int*)malloc(sizeof(int));
??? *pn = 15;
??? free(pn);
??? pn = NULL; // 置空
??? free(pn); // OK,沒有問題
??? double* pd = new double;
??? *pd = 212.211;
??? delete = pd;
??? short* ps = new short[128]; // new出一個數組來
??? ps[1] = 1231;
??? ps[11] = 1111;
??? delete[] ps; // 請注意delete的語法。
??? CTest* pTest = new CTest; // new出一個對象,并初始化
??? // …… 干活
??? delete pTest; // 析構,釋放內存
}

// 以下是一個重載new操作符的例子,一般來說是不會用到的,除非要設計一個編譯器之類的東西。
class Sample
{
public:
??? static CSample* operator= new()
??? {
??????? CSample* p = (CSample*)malloc(size(Sample));
??????? __m_nCount++; // 記錄這個類被申請的對象的數目
??????? return p;
??? }

private:
??? static int __m_nCount_;
};

總結

以上是生活随笔為你收集整理的new/delete和malloc/free的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。