繁体   English   中英

释放malloc结构的数组时出错

[英]Error while freeing a malloc'd array of structs

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

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*)’

任何想法可能是什么原因造成的? 如果我离开自由(* temp_array); 总共,程序可以编译并运行良好。 免费(temp_array); 导致段错误

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

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)

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

无论如何,在我看来,您不应该释放temp数组,因为您的代码段似乎暗示您正在用它替换*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以便使内存为真。

释放所分配的内容是内存使用的基本原理。 如果释放未分配的内容,则可能会导致segmentfault。

代码已使用以下方式分配了内存:

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

然后,它应该使用以下方法释放内存:

    free(*temp_array);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM