当g_array_append_val()
或GLib中的其他一个追加/前置函数使得GArray的长度大于guint(unsigned int)可以容纳的长度时会发生什么?
文档没有说明任何内容,所以我应该假设在附加之前我必须自己检查一下(除非我知道列表永远不会超过65535个元素)?
答案 0 :(得分:3)
GArray定义如下:
struct GArray {
gchar *data;
guint len;
};
因此它可以包含与内存一样多的数据。 并且,guint是unsigned int,最高可达4Gb,而不是65536。
深入研究GLib源代码,您可以看到,g_array_append_val将调用g_array_expand,后者将依赖g_realloc重新分配内存。在g_realloc源代码中,您可以看到:
newmem = glib_mem_vtable.realloc (mem, n_bytes);
TRACE (GLIB_MEM_REALLOC((void*) newmem, (void*)mem, (unsigned int) n_bytes, 0));
if (newmem)
return newmem;
g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes", G_STRLOC, n_bytes);
因此它将失败并显示消息'未能分配%d字节'。