new--------delete
malloc--------freec++
問題:程序員
我又一個對象類,裏面有一個指針鏈表,動態分配空間,在析構的時候釋放。開始對對象進行new操做,可是執行delete對象操做的時候出錯,提示在析構的時候內存有問題。但是這時候成員一個比特的內存都沒有分配啊。因此析構的時候應該什麼內存操做都不執行。
更奇怪的是採用free()函數就能夠釋放這種對象,可是內存卻不見減小,整個程序內存佔用節節升高?這是爲何?數組
回覆1:安全
你在析構函數當中沒有正確的釋放你申請的內存,好比,這個對象當中有一個指針,是採用動態申請內存的,在構造函數當中應該把它的值設置爲NULL,而後在某個方法當中會申請內存,是採用new方法進行申請的,在析構函當中,應該先判斷該指針是否爲空,若是不爲空,則使用delete釋放內存,而後再把該指針設置爲NULL。這樣就能夠了,若是你在外面是採用new申請這個對象,則在使用完成後使用delete釋放就能夠了。函數
回覆2:測試
補充一點:new和malloc雖然都是申請內存,但申請的位置不一樣,new的內存從free store
分配,而malloc的內存從heap分配(詳情請看ISO14882的內存管理部分),
free store和heap很類似,都是動態內存,可是位置不一樣,這就是爲何new
出來的內存不能經過free來釋放的緣由。不過微軟編譯器並無很好的執行標準,
頗有可能把free store和heap混淆了,所以,free有時也能夠。再補充一點:delete時候不須要檢查NULL
回覆3:spa
呵,我也來湊合
若是TYPE *p = new TYPE[n] 那麼就要 delete[] p指針
回覆4:code
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:
malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們均可用於申請動態內存和釋放內存。
對於非內部數據類型的對象而言,光用maloc/free沒法知足動態對象的要求。對象在建立的同時要自動執行構造函數,對象在消亡以前要自動執行析構函數。因爲malloc/free是庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函數和析構函數的任務強加於malloc/free。所以C++語言須要一個能完成動態內存分配和初始化工做的運算符new,以及一個能完成清理與釋放內存工做的運算符delete。注意new/delete不是庫函數。
回覆6:
delete的時候可能須要釋放多個指針的內存 free和delete的區別是 對於對象來講 free的確釋放了對象的內存,可是不調用對象的析構函數,因此若是在對象中使用new分配的內存就會泄露 delete不只釋放對象的內存,而且調用對象的析構函數