我有以下代码:
void fn(char *string , int flag)
{
static char* array_of_strings[100];
static int index = 0;
if(flag)
{
array_of_strings[index] = (char *)malloc(10);
strcpy(array_of_strings[index] , string);
index++;
}
else
{
//How should I deallocate the memory here?
index--;
}
}
如果满足else块,array_of_strings [index]会发生什么?是自动处理还是会在fn()返回后保留?我应该使用这一行来代替评论:
array_of_strings[index] = 0;
或者我可以像这样使用free():
free(array_of_strings[index]);
这会释放malloc分配的内存块吗?
答案 0 :(得分:3)
这没关系:
/* Allocate an array to hold 100 char * pointers: OK */
static char* array_of_strings[100];
/* Allocate space to hold one 9-character string: OK */
array_of_strings[index] = malloc(10);
/* Free string: OK */
free(array_of_strings[index]);
这会让你感到悲伤:
/* Whoops: step on the pointer, then try to free it. Not good :( */
array_of_strings[index] = 0;
free(array_of_strings[index]);
问:如果else阻塞,array_of_strings [index]会发生什么 满足了?是自动处理还是会在fn()之后保留 返回?
答:如果你使用malloc,它将保持分配状态,直到你“释放()”它......或者直到程序终止。
答案 1 :(得分:3)
致电
free(array_of_strings[index]);
不释放char*
的静态数组,它释放为动态分配的10 char
保留的内存块,以及存储在{{1}中的指针指针数组。这是避免内存泄漏的正确方法。
另一方面,这一行使得无法访问动态分配的内存块:
static
这种情况通常被称为“内存泄漏”。你应该避免它。
请注意,将array_of_strings[index] = 0;
d指针设置为零以避免意外解除引用并不常见,如下所示:
free
如果你这样做,你可以告诉free(array_of_strings[index]);
array_of_strings[index] = 0; // Prevent a "dangling reference"
的指针在以后的某个时间不再有效。