Malloc與new的區別

來源:互聯網
上載者:User

1,malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

2,對於非內部資料類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在建立的同時要自動執行建構函式,對象在消亡之前要自動執行解構函式。由於malloc/free是庫函數而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和解構函式的任務強加於malloc/free。

3,因此C++語言需要一個能完成動態記憶體分配和初始化工作的運算子new,以一個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函數。

4,C++程式經常要調用C函數,而C程式只能用malloc/free管理動態記憶體

new 是個操作符,和什麼"+","-","="...有一樣的地位. 
malloc是個分配記憶體的函數,供你調用的.

new是保留字,不需要標頭檔支援.
malloc需要標頭檔庫函數支援.

new 建立的是一個對象,
malloc分配的是一塊記憶體.

free()到底釋放了什麼簡而言之:
new      是一個操作符,可以重載   
malloc 是一個函數,可以覆蓋   
new      初始化對象,調用對象的建構函式,對應的delete調用相應的解構函式   
malloc 僅僅分配記憶體,free僅僅回收記憶體

   這個問題比較簡單,其實我是想和第二大部分的題目相呼應而已!哈哈!free()釋放的是指標指向的記憶體!注意!釋放的是記憶體,不是指標!這點非常非常重要!指標是一個變數,只有程式結束時才被銷毀。釋放了記憶體空間後,原來指向這塊空間的指標還是存在!只不過現在指標指向的內容的垃圾,是未定義的,所以說是垃圾。因此,前面我已經說過了,釋放記憶體後把指標指向NULL,防止指標在後面不小心又被解引用了。非常重要啊這一點

new建立的對象你可以把它當成一個普通的對象,用成員函數訪問,不要直接存取它的地址空間
malloc分配的是一塊記憶體地區,就用指標訪問好了,而且還可以在裡面移動指標.

在進行C/C++編程開發時,經常會遇到malloc/free 與 new/delete 這兩對操作,主要功能就是可以在程式運行過程中動態申請、釋放記憶體,從而達到對記憶體的操作。但是這兩對操作是有區別的,不能交叉搭配使用:即不能free掉new來的記憶體,也不能delete掉malloc來的記憶體空間。雖然有時候可以delete掉malloc來的記憶體,或者free掉new來的記憶體,但是通常情況下會給程式帶來不可預知的錯誤,相信這不是編程人員所希望看到的。要養成一個良好的習慣就是嚴格的配對使用:只用free來釋放malloc的記憶體空間、只用delete來釋放new來的記憶體空間。

     這兩對操作的區別:

     1、malloc/free是C/C++中的方法(函數),new/delete是C++中的操作符。

     2、malloc申請的是heap區的記憶體空間,而new則是申請的free store區的記憶體空間。

     3、使用free之前要判斷,使其free的指標是!NULL的,使用delete則無須判斷。

     4、free掉的記憶體是該指標指向的一段記憶體空間,裡面應該是空的。而delete掉的記憶體是裡面確實存有

          資料或者對象的。

      5、一下舉例說明其區別:

    malloc和free(及其變體)會產生問題的原因在於它們太簡單:他們不知道建構函式和解構函式。

假設用兩種方法給一個包含10個string對象的數組分配空間,一個用malloc,另一個用new:

   

string *stringarray1 =
static_cast<string*>(malloc(10 * sizeof(string)));

string *stringarray2 = new string[10];

其結果是,stringarray1確實指向的是可以容納10個string對象的足夠空間,但記憶體裡並沒有建立這些對象。而且,如果你不從這種晦澀的文法怪圈(詳見條款m4和m8的描述)裡跳出來的話,你沒有辦法來初始化數組裡的對象。換句話說,stringarray1其實一點用也沒有。相反,stringarray2指向的是一個包含10個完全構造好的string對象的數組,每個對象可以在任何讀取string的操作裡安全使用。

假設你想了個怪招對stringarray1數組裡的對象進行了初始化,那麼在你後面的程式裡你一定會這麼做:

free(stringarray1);
delete [] stringarray2;// 參見條款5:這裡為什麼要加上個"[]"

調用free將會釋放stringarray1指向的記憶體,但記憶體裡的string對象不會調用解構函式。如果string對象象一般情況那樣,自己已經分配了記憶體,那這些記憶體將會全部丟失。相反,當對stringarray2調用delete時,數組裡的每個對象都會在記憶體釋放前調用解構函式。

既然new和delete可以這麼有效地與建構函式和解構函式互動,選用它們是顯然的。

把new和delete與malloc和free混在一起用也是個壞想法。對一個用new擷取來的指標調用free,或者對一個用malloc擷取來的指標調用delete,其後果是不可預測的。大家都知道“不可預測”的意思:它可能在開發階段工作良好,在測試階段工作良好,但也可能會最後在你最重要的客戶的臉上爆炸。

new/delete和malloc/free的不相容性常常會導致一些嚴重的複雜性問題。舉個例子,<string.h>裡通常有個strdup函數,它得到一個char*字串然後返回其拷貝:

char * strdup(const char *ps); // 返回ps所指的拷貝
在有些地方,c和c++用的是同一個strdup版本,所以函數內部是用malloc分配記憶體。這樣的話,一些不知情的c++程式員會在調用strdup後忽視了必須對strdup返回的指標進行free操作。為了防止這一情況,有些地方會專門為c++重寫strdup,並在函數內部調用了new,這就要求其調用者記得最後用delete。你可以想象,這會導致多麼嚴重的移植性問題,因為代碼中strdup以不同的形式在不同的地方之間顛來倒去。

c++程式員和c程式員一樣對代碼重用十分感興趣。大家都知道,有大量基於malloc和free寫成的代碼構成的c庫都非常值得重用。在利用這些庫時,最好是你不用負責去free掉由庫自己malloc的記憶體,並且/或者,你不用去malloc庫自己會free掉的記憶體,這樣就太好了。其實,在c++程式裡使用malloc和free沒有錯,只要保證用malloc得到的指標用free,或者用new得到的指標最後用delete來操作就可以了。千萬別馬虎地把new和free或malloc和delete混起來用,那隻會自找麻煩。

既然malloc和free對建構函式和解構函式一無所知,把malloc/free和new/delete混起來用又象嘈雜擁擠的晚會那樣難以控制,那麼,你最好就什麼時候都一心一意地使用new和delete吧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.