C如何免费使用?

时间:2014-01-03 13:41:56

标签: c free

我不确定何时免费拨打电话?你能帮我解决这个问题吗?

以下是示例代码:

char *array[1000];
for( i < 100){ //its example, it isnt correct syntax
        if(i%2 == 0){
           array[i] = someMethod(i);
        }else{
           array[i] = "BLABLABLA";
        }
}

char * someMethod(int i){
        char *pointer;
        pointer = malloc(i); // some lenght

.
.
.
.
.

       return pointer;
}

现在,我想使用free并删除所有堆分配的内存,当我完成使用内存以防止内存泄漏时,我该怎么做?

free(array);不起作用,报告

  

尝试释放非堆对象

3 个答案:

答案 0 :(得分:2)

您需要为array的每个元素免费拨打电话。 array是一个静态数组(也是您得到的错误attempt to free non-heap object),这就是为什么你不能free它。另一方面,它的元素是动态分配的,你可以 释放它们。写一个简单的循环,并为其中的array元素免费调用。

编辑:实际上,您只能在动态分配的array元素上免费拨打电话。当您将字符串文字分配给某些元素并为其他元素动态分配内存时(使用malloc),您必须使用辅助数组,其中为每个元素存储一个标志,指示它是动态分配还是指向字符串文字。之后,只在一个循环中释放动态分配的元素。

答案 1 :(得分:2)

对于free的每次通话,您都可以(确实应该)只有一次malloc来电。

array[i] = someMethod(i);
因此

应该(稍后)与

配对
free(array[i]);

但这不起作用,因为

array[i] = "BLABLABLA";

指定一些元素指向字符串文字。你没有为这些分配内存,所以不能free

您需要记住哪些元素是动态分配的,或者为当前包含文字的元素分配内存

array[i] = strdup("BLABLABLA");

答案 2 :(得分:-1)

你必须释放所有元素。

for( i < 100){
 if(i%2 == 0)
   free(array[i]);
 i++;
}

但是这样,整个数组都不会被释放。因为你已经为其中一些分配了字符串文字,所以无法释放。 您只能free动态分配的内容,例如使用malloccalloc