Glib 内存分配错误

Posted

技术标签:

【中文标题】Glib 内存分配错误【英文标题】:Glib memory allocation error 【发布时间】:2013-08-12 12:54:29 【问题描述】:

我在 ubuntu 上使用库 libfprint,我试图通过我的 java 代码调用一个函数。

API_EXPORTED struct fp_img *fpi_img_new(size_t length)

    struct fp_img *img = g_malloc(sizeof(*img) + length);
    memset(img, 0, sizeof(*img));
    fp_dbg("length=%zd", length);
    img->length = length;
    return img;

我将整数值 5 从我的 java 代码传递给这个函数。当我尝试执行上述功能时,出现以下错误:

GLib-ERROR **: /build/buildd/glib2.0-2.30.0/./glib/gmem.c:170: failed to allocate 3077591024 bytes

我在 2 台不同的 ubuntu 机器上尝试了相同的代码,但错误仍然相同。我不知道它为什么要为 24+5 长度分配这么多字节。

谁能建议我任何解决方案?

【问题讨论】:

看起来缺少解引用。就像你有 size_t * 一样。 no.. size_t 是 int 类型。如果我使用 size_t * 它会在编译时出错。 当然你需要用*length取消引用它。让我给你一个答案 我预测有人在调用此函数时进行了强制转换以避免错误。我还预测代码要么充满了有人忽略的警告,要么警告被禁用。注意警告,只有在您肯定知道自己在做什么时才添加类型转换。 【参考方案1】:

The source code 明确指出:

/* structs that applications are not allowed to peek into */
(...)
struct fp_img;

所以,我不确定你做了什么来编译需要struct fp_img 大小的东西:你不应该这样做,因为结构声明是不透明的。

【讨论】:

我认为这不会解决问题,但另一方面它清楚地表明分配 fp_img 的方式不正确。【参考方案2】:

看起来你得到的是一个指针而不是size_t。 尝试将您的定义更改为:

API_EXPORTED struct fp_img *fpi_img_new(size_t * length);

然后你需要取消引用它:

API_EXPORTED struct fp_img *fpi_img_new(size_t * length)

    struct fp_img *img = g_malloc(sizeof(*img) + *length);
    memset(img, 0, sizeof(*img));
    fp_dbg("length=%zd", *length);
    img->length = *length;
    return img;

注意:似乎 3077591024 在堆栈 (0x125807FE) 上,它高度依赖于平台,所以不要引用我的话。

【讨论】:

【参考方案3】:

如果你改变了会发生什么

sizeof(*img)

sizeof(struct fp_img)

?我认为这可能是您的问题,因为在您调用 g_malloc() 时 *img 未初始化为任何内容。

【讨论】:

-1, sizeof 这个表达式是在编译时计算的,因此不依赖于参数是否“初始化”。【参考方案4】:

错误:struct fp_img *img = g_malloc(sizeof(*img) + length);

*img 是新创建的,所以不能像 "sizeof(*img)" 那样使用, 你可以这样写:“sizeof(struct fp_img)”

【讨论】:

sizeof(*img) 很好。正如@unwind 所说,它是一个在编译时评估的内置函数。在说废话之前先用你的编译器试试。

以上是关于Glib 内存分配错误的主要内容,如果未能解决你的问题,请参考以下文章

PHP致命错误:内存不足(分配80740352)(试图分配12352字节)

致命错误:X:\wamp\www\xxx 内存不足(已分配 1134559232)(试图分配 32768 字节)

访问分配的内存时出现访问冲突错误[重复]

内存分配“错误:无法分配大小为 75.1 Mb 的向量”[重复]

如何模拟内存分配错误

WordPress PHP致命错误:内存不足(分配2097152)(试图分配4096字节)