我得到一個分段錯誤free
荷蘭國際集團一定指針後:free()之後的分段錯誤,這是什麼原因?
free(studentDB->name);
我可以沒有任何錯誤或警告得到其數值:
printf("[DBG] studentDB->name: %s\n", studentDB->name);
然而,正如我所說的,程序崩潰時我嘗試釋放它。導致分段錯誤的free
命令的最常見原因是什麼?
我得到一個分段錯誤free
荷蘭國際集團一定指針後:free()之後的分段錯誤,這是什麼原因?
free(studentDB->name);
我可以沒有任何錯誤或警告得到其數值:
printf("[DBG] studentDB->name: %s\n", studentDB->name);
然而,正如我所說的,程序崩潰時我嘗試釋放它。導致分段錯誤的free
命令的最常見原因是什麼?
如果你沒有malloc()
它,你不能free()
它。 studentDB->name
從哪裏來?
你可能已經或者免費()「主編它已經,或致電它放在未分配的指針改寫超限
從free
段錯誤可導致緩衝區塊前面的malloc的信息與malloc
,或已經free
已經。
如果您發佈studentDB->name
分配的代碼,這將有所幫助。
通常在程序的其他地方發生堆損壞。堆通常是連續的,並且堆管理器圍繞帶有標題的堆塊來跟蹤塊 - 如果覆蓋該塊的標題,訪問該標題很好,但free
很可能會失敗。
以前有studentDB->name
嗎?如果您沒有爲該字段分配內存,那麼很可能是您撥打free
時,最終會出現seg-fault錯誤!請檢查該字段,確保它是malloc
d或strdup
d。
或者是有腐敗在堆上別處,與此正好爲你正確地指出,你所看到的name
值...
希望這有助於 最好的問候, 湯姆。
如果studentDB爲NULL,也可能是訪問studentDB指針的名稱成員是segfault。
從手冊頁:
免費(PTR)釋放內存空間 ptr所指向的,這一定是 已返回由以前調用 的malloc(),釋放calloc()或realloc() 。 否則,或者如果免費(ptr)已經在之前調用過 ,則會發生未定義的 行爲。如果ptr爲NULL,則不執行 操作。
你也可以檢查:
或者您嘗試釋放它兩次。我認爲更常見。 – 2010-02-21 21:39:17
現貨。這是一個指針,但我沒有使用'malloc'來爲它分配內存。 – Pieter 2010-02-21 21:39:57