2012-02-14 48 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

相关问题