C中的可用内存(无法修复内存泄漏)

时间:2011-10-14 20:22:46

标签: c arrays memory pointers malloc

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

目前我正在编写一个将命令行参数复制到动态分配的数组中的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); 

但是,我仍然会发生内存泄漏。我不太确定我做错了什么。如果有人能给我一些很棒的提示。

感谢!

4 个答案:

答案 0 :(得分:6)

你的最后一行free(array)并没有释放你原来的malloc,因为当你释放它的内容时你已经增加了array

另外(正如其他人指出的那样):

  • 释放数组内容的循环检查非零,但是你不能确保元素为零开始。

  • 当您只需要argc时,在数组中分配argc + 1个元素。

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

答案 1 :(得分:2)

array已经完全++了。 free(array)正在破坏你的堆,而不是自由。

添加

char ** array_iter = array;

然后将循环更改为

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

答案 2 :(得分:2)

通过使用后增量,您将指针设置为等于最初的指针。你不再释放正确的记忆。

答案 3 :(得分:0)

你的while循环不起作用。首先,仅为argc分配char*次空间。然后为每个字符串(空终止符)分配strlen + 1使用strcpy来复制字符串并在之后将它们大写(不易出错)。然后像这样free

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