在C语言中释放内存(无法修复内存泄漏)

4

编辑:我根据人们的建议修改了我的程序,但是我无法修复内存泄漏问题。此外,我需要在不使用 argc 的情况下释放它们,因此我需要以某种方式跟踪数组长度,所以我将最后一个元素标记为空。

目前我正在编写一个 C 程序,将命令行参数复制到动态分配的数组中。我的代码如下:

char **array;                                                                                                                                                                                     
int j;                                                                                                                                                                                        

array = malloc(sizeof(char*) * (argc + 1));                                                                                                                                                       
int i;                                                                                                                                                                                            
int index = 0;                                                                                                                                                                                    

for(i = 0; i < (argc); i++){                                                                                                                                                                      
    int length = strlen(*(argv + i));                                                                                                                                                             
    array[i] = malloc((length + 1) * sizeof(char));                                                                                                                                                                                                                                                                                                                                    
        // Cycle through all the chars and copy them in one by one                                                                                                                                
    for(j = 0; j <= length; j++){                                                                                                                                                                 
        array[i][j] = toupper(argv[i][j]);                                                                                                                                                        
    }                                                                                                                                                                                             
}      
array[i + 1] = NULL;                                                                                                                                                                                           

return array;      

之后,我尝试释放内存:

char** array_copy = array;
while(*array_copy != NULL){
    free(*array_copy++);
}
free(*array_copy) // free the null at the end
free(array); 

然而,我仍然遇到了内存泄漏问题。我不太确定我做错了什么。如果有人能给我一些提示,那就太好了。

谢谢!


为什么要为数组malloc argc + 1?你只需要argc次。此外,你的delete while循环是有问题的。始终保持对数组大小的计数。 - pmr
4个回答

7
你的最后一行 free(array) 没有释放你原来的 malloc,因为你在释放它的内容时增加了array
而且(正如其他人指出的):
  • 你用于释放数组内容的循环检查非零值,但你没有确保元素一开始就是零。

  • 你在数组中分配了 argc+1 个元素,但实际上只需要 argc 个。

  • *(argv + i)argv[i] 相同。


我已经根据你(和其他人)的建议更改了代码,但仍然存在内存泄漏问题。我使用 argc + 1 的原因是为了添加一个空元素来跟踪数组的结尾,因为在分配任务时我不允许使用以 argc 作为计数器的循环。对于造成的混淆,我感到抱歉,我已编辑我的帖子以符合我的当前代码。 - Matt

2

array已经被完全地从开头++掉了。 free(array)正在破坏你的堆,而不是释放它。

添加:

char ** array_iter = array;

然后将循环改为

while(*array_iter){
    free(*array_iter++);
}
free(array);

2

通过使用后增运算符,您将指针设置为原始值以外的其他值。这样,您就不能正确释放内存。


0

你的 while 循环不起作用。首先只为 char* 分配 argc 次空间。然后为每个字符串(包括 null 终止符)分配 strlen + 1 的空间,使用 strcpy 复制字符串并将它们转换为大写(更少出错)。最后使用以下方式进行释放:free

for(int i = 0; i < argc; ++i) free(array[i]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接