我在C文件中有以下结构和初始化:
struct Lattice {
int length;
int** latt;
};
struct Lattice* Create(int size){
struct Lattice latt;
int i,j,k,l;
latt.length = size;
latt.latt = malloc(sizeof(int*) * latt.length);
for(i=0; i<latt.length; i++){
latt.latt[i] = malloc(sizeof(int) * latt.length);
}
for(j=0; j<latt.length; j++){
for(k=0; k<latt.length; k++){
latt.latt[j][k] = 0;
}
}
struct Lattice* lattp = &latt;
return lattp;
我还有内存释放功能:
void Destroy(struct Lattice* lattp){
int l;
for (l=0; l<(lattp->length); l++){
free(lattp->latt[l]);
}
free(lattp->latt);
}
但每当我运行代码时:
int main(){
struct Lattice* lattp = Create(5);
Destroy(lattp);
return 0;
}
我得到了一个内存泄漏(据Valgrind说,它确实丢失了40个字节,另外80个间接丢失,如果这有任何区别)。
但是如果我有相同的代码,除了我将自由语句(与Destroy中的语句相同)写入Create(并适当地修改return语句),我不会得到内存泄漏。为什么将自由语句移动到单独的函数会导致内存泄漏?
答案 0 :(得分:2)
您的Create()
函数返回局部变量的地址:
struct Lattice* Create(int size){
struct Lattice latt; // this is a local variable - it only exists
// as long as the function Create() is running
int i,j,k,l;
latt.length = size;
latt.latt = malloc(sizeof(int*) * latt.length);
for(i=0; i<latt.length; i++){
latt.latt[i] = malloc(sizeof(int) * latt.length);
}
for(j=0; j<latt.length; j++){
for(k=0; k<latt.length; k++){
latt.latt[j][k] = 0;
}
}
struct Lattice* lattp = &latt; // this takes the address of a local variable
return lattp; // after this return, latt no longer exists
}