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 字节)