【问题标题】:Error while freeing a malloc'd array of structs释放 malloc 的结构数组时出错
【发布时间】:2013-04-27 22:48:02
【问题描述】:

我在释放用于将另一个数组的大小加倍的临时结构数组时遇到问题。释放原始数组似乎没有任何问题。

void foo(StruName **structName,i nt *size)
{ 
...
 StruName *temp_array = (StruName*) malloc(*size * 2 * sizeof(StruName));
 for (i = 0; i < *size; i++)
   temp_array[i] = (*original_array)[i];
 free(*original_array);
 *original_array = temp_array;
 free(*temp_array);

我使用 g++ -Wall 得到以下错误

error: cannot convert ‘StruName’ to ‘void*’ for argument ‘1’ to ‘void free(void*)’

任何想法可能导致这种情况?如果我离开 free(*temp_array);总之,程序编译并运行良好。免费(临时数组);导致段错误

【问题讨论】:

  • 如果你能发布整个程序会有所帮助。无论如何,倾向于我指出的错误。函数声明的第一行本身就有错误。
  • 糟糕,很抱歉不清楚。 Struct 是 typedef 结构的名称。将其更改为 StruName

标签: c struct malloc free


【解决方案1】:

以下部分函数定义不正确:

void foo(Struct **structName, int count, int *size)

您是否已将您的结构声明为structName?如果是,你需要在定义中提到参数,而不仅仅是它的类型。即使structName是你的结构,那么你应该写struct structName**而不是Struct **structName。(Struct是与 C 中的 struct 不同)

这里还有一个错误:

malloc(*size * 2 * sizeof(original_array)

您应该将*size 括在大括号中,因为不清楚您是取消引用size 还是取消引用size*2*sizeof(original_array)

【讨论】:

    【解决方案2】:

    original_array是指向指针的指针是什么原因?

    无论如何,在我看来,您不应该释放 temp 数组,因为您的代码 sn-p 似乎暗示您正在用它替换 *original_array。如果是这样,那么你就是 使用释放的内存;这可能会运行一段时间,但最终您可能会发现您的数组值被覆盖,因为释放的内存被重新分配给其他东西。

    // here *original_array will be pointing to the new `malloc`ed memory
    *original_array = temp_array;
    
    // After this line, *original_array is left dangling to the recently freed memory
    
    free(*temp_array);
    

    我会删除最后一行。

    *编辑* 我之前提到过内存会被释放两次,但事实并非如此,因为应该在不取消引用 *temp_array 的情况下调用 free 才能实现这一点。

    【讨论】:

    • 无法判断,您的代码 sn-p 不包含对 days 变量的任何引用。就像其他人建议的那样,如果您发布更多代码会很方便。 :)
    • 哎呀,哈哈。免费阅读(* original_array):P - 谢谢。反正我要覆盖它,这没什么用吗?我注意到无论有没有它,该程序似乎都运行良好(valgrind 似乎也没有注意到)。
    【解决方案3】:

    释放分配的内存是内存使用的基本原则。如果你释放你没有分配的东西,它可能会导致段错误。

    代码已分配内存:

        StruName *temp_array = (StruName*) malloc(*size * 2 * sizeof(StruName));
    

    然后它应该释放内存:

        free(*temp_array);
    

    确保两个参数的内容都正确。

    【讨论】:

    • 嗨丹尼尔,从 OP 代码看来 temp_array 的值正在替换 *original_array。如果 temp_array 被释放,*original_array 值将悬空在释放的内存中。
    • @sgorozco 你是绝对正确的。指针操作应该非常小心,尤其是在 C 语言中。我要解决的是 Mark 问的问题“如果我完全离开 free(*temp_array);,程序编译并运行良好。free(temp_array) ; 导致段错误"
    • 我的意思是,如果我用 free(temp_array); 释放 temp_array,我会得到一个段错误。我认为这一定是因为我正在释放 *original_array 在块末尾分配的内存。
    • 使用免费(*temp_array);不能做任何事情,因为它被错误地投射。将它们都排除在外(并且必须是正确的做法)。
    • @Mark 是的,这里的问题是 original_array 是什么意思?我们没有找到 original_array 的来源。所以我觉得我们最好看一下或者发一个完整的简单的demo代码,可以工作和调试。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2014-12-13
    • 1970-01-01
    • 2017-02-25
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多