假设我有一个字符串数组,其中一些已经是免费的,例如:
char **array;
array = malloc(20*sizeof(char*));
for(i=0;i<arr_size;i++)
{
array[i]='\0';
free(array[i]);
}
free(array);
这是一种正确的方法吗?因为我似乎仍然有一些内存泄漏, 在我的例子中是一个包含20个字符串的数组,其中9个已经被释放。
我想问题是如何解放自由&#34;释放&#34;字符串。 谢谢你的帮助!
答案 0 :(得分:2)
我想问题是如何释放“释放”字符串。
嗯,你没有。您必须free
每malloc
个'字符串恰好一次。在同一个字符串上多次调用free
将导致未定义的行为。
除此之外,您的问题如下:
array[i]='\0';
在这里,您在free
之前覆盖指针的值。
答案 1 :(得分:1)
按照惯例,您应该始终在NULL
之后设置指向free
的指针。然后你应该检查指针是否是NULL
,如果没有,那么你可以free
。这样你就可以跟踪哪些是free
- ed,哪些没有。
答案 2 :(得分:0)
1 malloc()
分配只需要1 free()
来释放内存。所以free(array);
足以释放内存。
free()
释放内存与使用malloc()
动态分配的内存相反。
答案 3 :(得分:0)
使用free(array [i]);当您尝试释放其值(指针)在前一行上已更改的指针时,将导致出现问题/奇怪错误。
代码 阵列[I] =&#39; \ 0&#39 ;;
可能没有所需的结果,因为它设置指针值而不是字符内容。也许是sprintf(array [i],&#34; \ 0&#34;);会更好
char **array=NULL; //(Helps you to give it an initial value pointing to NULL)
array = malloc(arr_size+1);
if (!array[i])
{
// array == NULL which is not right after malloc
// there has been an error with malloc, trap and exit somehow
}
else
{
// Use array as you wish as it has been allocated, take care not to
// run past the end of the array length
}
if (array[i]) free(array[i]); // checks that it is not NULL anymore, as NULL does not need freeing.
您可以将IF语句扩展为:(表示与上面相同,但包括强制释放的变量为NULL)
if (array[i]!=NULL)
{
free(array[i]);
array[i] = NULL;
}