【问题标题】:malloc fails after I use a large amount of nodes使用大量节点后 malloc 失败
【发布时间】:2012-10-13 17:29:45
【问题描述】:

我必须创建一个程序,它能够生成一个 GML 文件。

为此我实现了一个函数GetEdges,这个函数应该返回三个数组(通过引用调用)。

函数的签名如下:

bool GetEdges(DG_NODE_ID **sourceIds, DG_NODE_ID **destIds, int **weights, int *count)

在函数内我要分配空间:

*sourceIds = (DG_NODE_ID *) malloc(cntEdges * sizeof (DG_NODE_ID));

只要我使用 4 个节点,我就会得到以下输出:

图:malloc.c:2451:sSYSMALLOc:断言`(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size)

= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' 失败。

我尝试了所有方法,但我不知道为什么在使用 4 个节点后会失败。

我上传了整个源代码:Download - Source code

【问题讨论】:

  • 在调用 malloc 失败之前,cntEdges 的值是多少?
  • 使用调试器并查看您正在操作的值。或者使用 valgrind 之类的工具跟踪内存使用情况。
  • cntEdges 等值是正确的值。我上传了整个源代码,如果需要,您可以查看。

标签: c malloc


【解决方案1】:

这很可能意味着您正在滥用分配的内存:

  1. 在分配给你的东西开始之前写(不常见)。
  2. 在分配的内容结束后写入(常见)。
  3. 释放以前未分配的东西(不常见)。
  4. 在释放空间后写入先前分配的空间(常见)。

你有valgrind吗?如果是这样,请使用它。如果没有,请尽可能获取并使用它。 (它可用于许多类 Unix 系统;它不适用于 Windows AFAIK。)

【讨论】:

  • 非常感谢,找到了 valgrind 的错误 :)
【解决方案2】:

您是否验证过 cntEdges 是一个合理的值,而不是一些未初始化的(和非常大的数字)值?

【讨论】:

    猜你喜欢
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2020-07-05
    • 2019-11-15
    相关资源
    最近更新 更多