我遇到了释放临时数组结构的问题,这些结构用于将另一个数组的大小加倍。我似乎没有任何问题解放原始阵列。
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);导致段错误
答案 0 :(得分:2)
功能定义的以下部分不正确:
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)
答案 1 :(得分:1)
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以使其成为真。
答案 2 :(得分:0)
内存使用的基本原则是释放你分配的东西。如果您释放了未分配的内容,则可能会导致段错误。
代码已使用以下内容分配内存:
StruName *temp_array = (StruName*) malloc(*size * 2 * sizeof(StruName));
然后它应该释放内存:
free(*temp_array);
确保两个参数的内容都正确。