2012-02-14 162 views
3

該段錯誤發生的情況:GLIB段錯誤:當我運行沒有可用的源 「g_slice_alloc()」

alignarray *aligns = g_ptr_array_sized_new(N_DEFAULT_ALIGNS); 

...,其中alignarray只是GPtrArray

該聲明成功運行多次,然後突然失敗,報告「無源可用於g_slice_alloc()。搜索後,我嘗試使用export G_SLICE=always-malloc禁用分片內存分配,但它仍然失敗...

或者是因爲代碼中的某處我沒有很好地處理內存?目前我的問題是我不知道在哪裏調試。我試過gdbvalgrind,但都無濟於事。

回答

1

奇怪的是,設置G_SLICE=always-malloc仍然會導致此問題。片分配器是一種通過爲具有相似大小的動作重複使用內存來避免分配內存的開銷。

如果你分配了100個長度爲8個字節的東西(比如32位的2個指針),並且分配更多的東西,那麼你將重新使用相同的內存。需要注意的是,您必須確保使用片分配器分配的內存可以使用片分配器功能釋放 - 直接通過g_slice_free或間接通過類似g_object_unref的內容來檢查您的代碼是否沒有釋放其他GPtrArray(或與g_free

您可以使用valgrind識別發生錯誤釋放或損壞的位置。使用valgrind時必須G_SLICE=always-malloc

相關問題