2012-02-14 2 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, чтобы отключить выделение памяти нарезки, но он все равно не работает ...

Или это потому, что где-то в коде я плохо обрабатывал память? В настоящее время моя проблема в том, что я не знаю, где отлаживать. Я пробовал gdb и valgrind, но оба не могут помочь.

ответ

1

Странно, что установка G_SLICE=always-malloc все еще дает эту проблему. Распределитель среза - это способ избежать накладных расходов на выделение памяти путем повторного использования памяти для действий, размер которых аналогичен.

Если вы выделили 100 вещей длиной 8 байтов (например, 2 указателя на 32-разрядной версии), освободите их и выделите еще несколько, то вы будете повторно использовать одну и ту же память. Большое предостережение состоит в том, что вы должны убедиться, что память, выделенная с помощью распределителя срезов, освобождается с помощью функций распределителя срезов - прямо через g_slice_free или косвенно через что-то вроде g_object_unref Проверьте свой код, который вы не освобождаете от других экземпляров GPtrArray (или что-то похожего размера) с g_free

Возможно, вам удастся определить, где происходит ошибочное освобождение или повреждение, используя valgrind. При использовании valgrind вы must комплект G_SLICE=always-malloc

Смежные вопросы