我不确定何时免费拨打电话?你能帮我解决这个问题吗?
以下是示例代码:
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);
不起作用,报告
尝试释放非堆对象
答案 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
动态分配的内容,例如使用malloc
或calloc
。