用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);
// p points to an object without
// header. Free will crash or
// it will corrupt the free list.

2.

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本身是用什麼語言寫的?

TAG:CC | 編譯器 | 內存泄露 |