用new申請的內存如果使用free函數來釋放會有怎樣的結果?
我知道new申請堆空間的時候會初始化堆空間,而free函數不會調用析構函數只是直接釋放空間,如果類的對象沒有申請額外的對空間的話,析構函數就不用做釋放操作,這樣的情況下用free函數 是不是就沒有問題,我覺得析構函數在底層做的事情似乎很神秘?
這是未定義行為。另外,考慮p = new Foo[n]對應delete [] p,後者不用提供n,說明在實現上需要分配額外空間記錄數組大小,以供析構。
問題說明中說new會初始化也不正確,對於POD而言不加上括弧是不會初始化的。
1:C++默認的內存分配器,未必是malloc/free使用的那個。2:對象在delete的時候會調用析構函數,free不會。
new/delete會調用operator new/delete函數,而每個類可以自己定義operator new/delete函數。
沒記錯的話是未定義,new就乖乖用delete,free就乖乖匹配malloc
free的話不會調用析構函數,就像malloc不會調用構造函數一樣。
不作死就不會死你造嗎?以下來自今年課C Programming的講義:
Wild Frees
Wild frees happen when a program attempts to
free a pointer in memory that was not returned by
malloc.
Since the memory was not returned by malloc, it
does not have a header.
When attempting to free this non-heap object, the
free may crash.
Also if it succeeds, the free list will be corrupted so
future malloc/free calls may crash.Also memory allocated with malloc() should
only be deallocated with free() and memory
allocated with new should only be
deallocated with delete.Wild frees are also called 「free of non-heap
objects」.Example:
1.
int q;
int * p = q;free(p);
2.
// p points to an object without
// header. Free will crash or
// it will corrupt the free list.
char * p = (char*)malloc(100);
p=p+10;free(p);
// p points to an object without
// header. Free will crash or
// it will corrupt the free list.
new-&>operator new() -&> malloc() --如果失敗--&>_callnewh(*func)回調函數--&>返回非0繼續malloc() 返回0拋出異常 當然複雜類型會先調用構造函數
delete -&> operator delete() -&> RTCCALLBACK(默認空的宏定義) -&> free() 複雜類型也會先調用析構再調用operator delete() 簡單數據類型new[] delete,或delete[]都可以,因為無需調用析構,具體只是free實現複雜數據類型,new[]出來的內存只能由delete[]釋放!因為new[] 會在返回的地址處表示數組的長度, delete[]會根據這個長度執行對應次數的析構函數, 而delete只會去調用指針處的析構函數, 指針處是數組長度啊!所以會出現異常!vs 和 g++ 的delete實現也不同, vs delete後會改變原指針所存的地址, gun不會改變原地址一般情況是沒調用析構函數+內存泄露
一般情況下會導致析構函數沒有被正確調用。當類重載了new和delete時,後果很嚴重。
推薦閱讀:
※如何看待 NOIP 競賽選手用機與評測機編譯器行為不一致而導致評測出現的問題?
※為什麼微軟不單獨發行編譯器和鏈接器?
※如何看待微軟研究院的LEAN項目沒有使用微軟出品的編譯器?
※請問達到怎樣的水平才能進微軟這類公司從事搞編譯器這類工作?
※Golang本身是用什麼語言寫的?