2010-02-21 118 views
4

我得到一個分段錯誤free荷蘭國際集團一定指針後:free()之後的分段錯誤,這是什麼原因?

free(studentDB->name); 

我可以沒有任何錯誤或警告得到其數值:

printf("[DBG] studentDB->name: %s\n", studentDB->name); 

然而,正如我所說的,程序崩潰時我嘗試釋放它。導致分段錯誤的free命令的最常見原因是什麼?

回答

13

如果你沒有malloc()它,你不能free()它。 studentDB->name從哪裏來?

+0

或者您嘗試釋放它兩次。我認爲更常見。 – 2010-02-21 21:39:17

+1

現貨。這是一個指針,但我沒有使用'malloc'來爲它分配內存。 – Pieter 2010-02-21 21:39:57

2

你可能已經或者免費()「主編它已經,或致電它放在未分配的指針改寫超限

0

free段錯誤可導致緩衝區塊前面的malloc的信息與malloc,或已經free已經。

如果您發佈studentDB->name分配的代碼,這將有所幫助。

2

通常在程序的其他地方發生堆損壞。堆通常是連續的,並且堆管理器圍繞帶有標題的堆塊來跟蹤塊 - 如果覆蓋該塊的標題,訪問該標題很好,但free很可能會失敗。

0

以前有studentDB->name嗎?如果您沒有爲該字段分配內存,那麼很可能是您撥打free時,最終會出現seg-fault錯誤!請檢查該字段,確保它是malloc d或strdup d。

或者是有腐敗在堆上別處,與此正好爲你正確地指出,你所看到的name值...

希望這有助於 最好的問候, 湯姆。

0

如果studentDB爲NULL,也可能是訪問studentDB指針的名稱成員是segfault。

0

從手冊頁:

免費(PTR)釋放內存空間 ptr所指向的,這一定是 已返回由以前調用 的malloc(),釋放calloc()或realloc() 。 否則,或者如果免費(ptr)已經在之前調用過 ,則會發生未定義的 行爲。如果ptr爲NULL,則不執行 操作。

你也可以檢查:

  1. 是studentDB非NULL指針包含成員「名稱」一類/結構?
  2. studentDB-> name指向的空間是否由malloc/calloc/realloc返回?