[英]Free Memory in C (Can't fix memory leak)
编辑:我根据人们的建议改变了我的程序,但我无法修复内存泄漏。 另外,我需要在不使用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);
但是,我仍然得到内存泄漏。 我不太确定我做错了什么。 如果有人能给我一些很棒的提示。
谢谢!
你的最后一行free(array)
没有释放你原来的malloc,因为你释放它的内容时你已经增加了array
。
另外(正如其他人指出的那样):
你的循环释放数组内容是检查非零,但你不能确保元素为零开始。
当您只需要argc时,在数组中分配argc + 1个元素。
*(argv + i)
与argv[i]
相同。
array
已经完全++
倒是断开始的。 free(array)
正在破坏你的堆,而不是释放。
加
char ** array_iter = array;
然后将循环更改为
while(*array_iter){
free(*array_iter++);
}
free(array);
通过使用后增量,您将指针设置为等于原始值以外的其他值。 你不再释放正确的记忆。
你的while循环不起作用。 首先只为char*
分配argc
空间。 然后为每个字符串(null终止符)分配strlen + 1
使用strcpy
复制字符串并在之后将它们大写(不易出错)。 然后像这样free
:
for(int i = 0; i < argc; ++i) free(array[i]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.