但是,如果我在valgrind中执行以下代码:
valgrind --tool=memcheck --leak-check=full --num-callers=40 --show-possibly-lost=no
我可以看到内存未正确释放。
#include <stdio.h>
#include <stdlib.h>
void printVector(char ** vector, int N);
void allocateVector(char *** vector, int N, int M);
void deallocateVector(char *** vector, int N);
int main(int argc, char * argv[]) {
char ** vector;
int N=6;
int M=200;
allocateVector(&vector,N,M);
printVector(vector,N);
deallocateVector(&vector,N);
}
void allocateVector(char *** vector, int N, int M) {
*vector=(char **) malloc(N*sizeof(char *));
int i;
for(i=0; i<N; i++) {
(*vector)[i]=(char *) malloc(M*sizeof(char));
(*vector)[i]="Empty";
}
}
void deallocateVector(char *** vector, int N) {
int i;
char ** temp=*vector;
for(i=0; i<N; i++) {
if(temp[i]!=NULL) {
free(temp[i]);
}
}
if(temp!=NULL) {
free(temp);
}
*vector=NULL;
}
我无法找到错误的位置。
答案 0 :(得分:3)
问题在于:
for(i=0; i<N; i++) {
(*vector)[i]=(char *) malloc(M*sizeof(char));
(*vector)[i]="Empty";
}
您在(*vector)[i]
中分配空间并存储指向它的指针。然后用字符串常量"Empty"
的地址覆盖该指针。
这会导致两个问题:
malloc
返回的内存被泄露,因为您不再引用它。free
时,您将传递字符串常量的地址而不是已分配的内存块的地址。以这种方式呼叫free
会调用undefined behavior。您需要使用strcpy
函数将字符串常量复制到您分配的内存中:
for(i=0; i<N; i++) {
(*vector)[i]=malloc(M);
strcpy((*vector)[i],"Empty");
}
此外,don't cast the return value of malloc
和sizeof(char)
定义为1,可以省略。