【问题标题】:C - pointer being freed was not allocatedC - 被释放的指针未被分配
【发布时间】:2016-04-15 14:16:50
【问题描述】:

我试图从分配有malloc() 的向量中释放一个指针,当我尝试删除第一个元素(索引 [0])时,它可以工作,当我尝试删除第二个元素(索引 [ 1]) 我收到此错误:

malloc: *** error for object 0x100200218: pointer being freed was not allocated

代码:

table->t = malloc (sizeof (entry) * tam);
entry * elem = &table->t[1];
free(elem);

【问题讨论】:

    标签: c memory free


    【解决方案1】:

    您只能在malloc() 和家人返回的指针上调用(或需要)free()

    引用C11,第 7.22.3.3 章

    [...] 否则,如果 该参数与内存管理先前返回的指针不匹配 函数,或者如果空间已通过调用 freerealloc 释放,则 行为未定义。

    在您的情况下,table->t(或&table->t[0])是那个指针,而不是&table->t[1]

    也就是说,free()-ing table->t 释放了整个内存块,你不需要(你不能,而是)单独/部分释放。请参阅this answer 了解更多信息。

    【讨论】:

    • 也许补充一点,释放 &table->t[0] 仅有效,因为它等同于 table->t
    【解决方案2】:

    它适用于第一个元素,因为 &table->t[0] 等于 table->t。这是因为第一个元素与数组本身具有相同的地址(根据数组的定义)。 而且由于数组本身已经分配了一个地址,所以只有那个可以被释放。

    【讨论】:

      【解决方案3】:

      malloc() 通过分配单个连续内存区域来工作,其可用大小是它传递的单个整数参数。它返回分配区域的指针。

      您只能释放返回的指针一次,而不是它的子集。

      数组不是 C 中的对象,它们是指针算术的语法糖,这可能是 C 编程的主要难题,如果您致力于学习 C,则应该仔细研究该领域。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        相关资源
        最近更新 更多