Malloc與new的區別

原文地址:http://blog.csdn.net/gc315630/article/details/5833554

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吧

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