当g_array_append_val()
GLib 中的其他附加/前置函数或其中一个函数使 GArray 的长度大于 guint (unsigned int) 可以容纳的长度时会发生什么?
文档没有说明它,所以我是否应该假设我必须在添加之前自己检查一下(除非我知道列表永远不会超过 65535 个元素)?
当g_array_append_val()
GLib 中的其他附加/前置函数或其中一个函数使 GArray 的长度大于 guint (unsigned int) 可以容纳的长度时会发生什么?
文档没有说明它,所以我是否应该假设我必须在添加之前自己检查一下(除非我知道列表永远不会超过 65535 个元素)?
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 个字节”。