C语言 使用 free() 释放内存不起作用



这是一个小程序,它填充一些数组并将其内容打印在屏幕上:

#include <stdlib.h>
#include <stdio.h>
typedef struct{
    double **plist;
    int plistSize;
} ParticleList;
void sendPar(int *n, int np){
    // allocate memory for struct pl
    ParticleList pl;
    // allocate memory  for ParticleList np times
    pl.plist = malloc(sizeof(ParticleList) * np);
    // allocate memory for lists of size n[k]
    for(int k=0; k<np; k++){
        pl.plist[k] = malloc(sizeof(double) * n[k]);
    }
    // write some data to the list
    for(int k=0; k<np; k++){
        for(int l=0; l<n[k]; l++){
            pl.plist[k][l] = 100000*k+100*l;
        }
        pl.plistSize = n[k];
    }
    // print data to check
    for(int k=0; k<np; k++){
        printf("Listsize: %dn", n[k]);
        for(int l=0; l<n[k]; l++){
            printf("Processor %d, Entry %d, Value %lfn", k, l, pl.plist[k][l]);
        }
    }
    free(pl.plist);
}
int main(){
    int np = 3;
    int n[np];
    n[0] = 2;
    n[1] = 4;
    n[2] = 7;
    sendPar(n, np);
}

这是输出:

Listsize: 2
Processor 0, Entry 0, Value 0.000000
Processor 0, Entry 1, Value 100.000000
Listsize: 4
Processor 1, Entry 0, Value 100000.000000
Processor 1, Entry 1, Value 100100.000000
Processor 1, Entry 2, Value 100200.000000
Processor 1, Entry 3, Value 100300.000000
Listsize: 7
Processor 2, Entry 0, Value 200000.000000
Processor 2, Entry 1, Value 200100.000000
Processor 2, Entry 2, Value 200200.000000
Processor 2, Entry 3, Value 200300.000000
Processor 2, Entry 4, Value 200400.000000
Processor 2, Entry 5, Value 200500.000000

如果我现在想释放内存,使用 free(pl) 不起作用。我也尝试了free(pl.plist)确实有效。但是我仍然记得plistSize没有被释放。在这里释放内存的正确方法是什么?

此内存分配

pl.plist = malloc(sizeof(ParticleList) * np);
                  ^^^^^^^^^^^^^^^^^^^

没有意义。我想你的意思是

pl.plist = malloc( sizeof( double * ) * np);
                  ^^^^^^^^^^^^^^^^

此循环中的最后一条语句

// write some data to the list
for(int k=0; k<np; k++){
    for(int l=0; l<n[k]; l++){
        pl.plist[k][l] = 100000*k+100*l;
    }
    pl.plistSize = n[k];
    ^^^^^^^^^^^^^^^^^^^^
}

也没有意义,因为标量对象pl.plistSize在外部循环的每次迭代中都被覆盖。

要释放分配的内存,您可以写入

for(int k=0; k<np; k++){
    free( pl.plist[k] )
}
free( pl.plist );

Pl 是一个静态声明的变量,其中包含指向内存位置的指针。需要释放的是结构中的数组。

问题可能是你误解了mallocfree的工作原理。

变量pl及其成员plistSize不是由您分配的。它由编译器在编译代码时分配。你不应该试图释放它。

freemalloc的.

在我看来,问题在于,您让每个pl.plist[k]都已分配,从而导致内存泄漏。

一旦你free() -d pl.plist ,你就没有办法释放单个pl.plist[k],所以释放必须按照分配的相反顺序。

首先释放每个pl.plist[k],然后释放pl.plist本身。

最新更新