2012-02-14 6 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の設定でもこの問題が発生するのは奇妙です。スライスアロケータは、同様のサイズのアクションに対してメモリを再利用してメモリを割り当てるオーバーヘッドを回避する方法です。

8バイトの長さ(32ビットで2つのポインタのようなもの)を100個割り当てて、それらを解放してさらにいくつか割り当てると、同じメモリが再利用されます。大きな注意点は、スライスアロケータを使用して割り当てられたメモリが、スライスアロケータ関数を使用して、つまりg_slice_freeを介して、または間接的にg_object_unrefのように解放されることを保証する必要があるということです。GPtrArrayのインスタンスを解放しない同様のサイズのもの)g_free

valgrindを使用して誤った解放や破損が発生している場所を特定できる場合があります。 valgrindを使用する場合に設定する必要がありますG_SLICE=always-malloc