2011-05-16 124 views
4

我的問題很簡單。假設我們有:指針運算後釋放指針

char* ptr = (char*) malloc(sizeof(char)*SIZE); 
ptr+= SIZE/2; 
free(ptr); 

當我們釋放指針時會發生什麼?它是未定義的操作? 它是否釋放所有的SIZE緩衝區或僅剩餘的SIZE/2? 預先感謝您爲我消除歧義。

+0

謝謝大家,非常具體的答案,現在我知道如何在我的引擎中處理它。我認爲暗戀會發生,直到我真正嘗試了它,用gcc和C++,並沒有得到任何錯誤或暗戀。 我認爲它弄糟了我的記憶,但遲早會出現,因爲如果一個人留下,它會變得很討厭。 – Lefteris 2011-05-16 06:24:57

+1

請注意,從來沒有理由在C中從malloc中輸入結果。 – Lundin 2011-05-16 06:37:18

回答

9

你的程序就會崩潰:免費()操作實際上是在C語言很簡單,但只適用於原有分配的地址。

典型內存分配器工作原理是這樣的僞代碼:

  • 問ALLOC 64字節
  • 分配器allocs 70個字節(6字節以上)
  • 前2個字節被設置爲一個「簽名「,由分配器識別以識別由他分配的存儲器的模式
  • 接下來的4個字節表示分配的大小
  • 返回指向第7字節開始的指針

因此,當您撥打free(ptr)時,分配器會在您的指針前6個字節檢查簽名。如果它沒有找到簽名,它會崩潰:)

+0

非常好的解釋,謝謝。我知道有一個簽名,但不確定具體情況。 – Lefteris 2011-05-16 06:22:17

2

行爲未定義,很可能導致分段錯誤 - 這就是好案例。在最糟糕的情況下,它會破壞程序的內存並引發各種奇怪的錯誤和錯誤的輸出。

8

如果free()的參數與以前通過malloc()和朋友分配的指針不匹配,則行爲未定義。您很可能會在您的libc版本中遇到分段錯誤或失敗的斷言。

Offtopic:這是更好的,你不投的malloc()的結果C.

+0

感謝您的答案michael。我主要使用C++編碼,我認爲這是標準做法。我不知道C和malloc。請記住,謝謝。 – Lefteris 2011-05-16 06:26:47

2

在大多數實現中,這應該會導致某種致命錯誤。您只能釋放分配的緩衝區的開始。

他們會在窗口(使用Visual Studio編譯器)上得到的典型錯誤就像是「不是有效的堆指針」。在linux上,如phihag所述,通常會導致分段錯誤。在這兩種情況下,這是一個運行時錯誤,通常會終止程序的執行。

2

行爲是未定義的。我想你會得到一個segfault ...這是我在我的系統中嘗試時得到的。

free()要求調用者傳遞由存儲器分配器函數(如malloc())返回的地址。其他任何事情都會導致未定義的行爲。