这是一个小程序,它填充一些数组并在屏幕上打印其内容:
#include #include 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
没有释放的plistSize
。 在这里释放记忆的正确方法是什么?
这个内存分配
pl.plist = malloc(sizeof(ParticleList) * np); ^^^^^^^^^^^^^^^^^^^
没有意义。 我想你的意思是
pl.plist = malloc( sizeof( double * ) * np); ^^^^^^^^^^^^^^^^
这个循环中的最后一个语句
// write some data to the list for(int k=0; k
因为标量对象pl.plistSize
在外部循环的每次迭代中被覆盖,所以也没有意义。
要释放分配的内存,您可以编写
for(int k=0; k
P1是静态声明的变量,包含指向内存位置的指针。 它是结构中需要释放的数组。
问题可能是你误解了malloc
和free
是如何工作的。
变量pl
及其成员plistSize
不是由您分配的。 它在编译代码时由编译器分配。 你不应该试图释放它。
只free
你的malloc
。
我看到的问题是,你要分配每个pl.plist[k]
,导致内存泄漏。
一旦你有了free()
d pl.plist
,你将无法释放单独的pl.plist[k]
,因此释放必须按照相反的顺序进行分配。
首先释放每个pl.plist[k]
,然后释放pl.plist
本身。
以上就是c/c++开发分享使用free()释放内存不起作用相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519246.html