2

g_array_append_val()GLib 中的其他附加/前置函数或其中一个函数使 GArray 的长度大于 guint (unsigned int) 可以容纳的长度时会发生什么?

文档没有说明它,所以我是否应该假设我必须在添加之前自己检查一下(除非我知道列表永远不会超过 65535 个元素)?

4

1 回答 1

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 个字节”。

于 2013-05-07T09:53:43.897 回答