在c中释放2d矩阵时正确使用free()

B.I*_*Ing 4 c arrays malloc free memory-management

我刚刚开始用c学习编码,我和free()命令结合使用了一些关于2d矩阵的问题.

我知道你首先需要创建一个带指针的数组,指向矩阵的不同列:

double **array = (double **)malloc(5*sizeof(double *));
for(int n = 0; n<5; n++){

array[n] = (double *) malloc(6*sizeof(double));
Run Code Online (Sandbox Code Playgroud)

我知道然后解除分配这个矩阵的正确方法是首先释放各个行,然后释放数组指针本身.有点像:

for (i = 0; i < nX; i++){  
   free(array[i]); }     

free(array);
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么这有必要?我知道这不正确,但为什么你不能只使用:free(array)?根据我的理解,这会释放指针数组.当其他东西需要访问它时,列的使用内存是否会被覆盖?free(array)会以任何方式导致内存损坏吗?

任何帮助深表感谢!

Jea*_*bre 6

它不会导致腐败,不会,但会造成内存泄漏.

如果在你的程序中完成一次,它可能并不重要(很多专业/昂贵的应用程序都有 - 小的,无意的 - 内存泄漏),但是在循环中重复这一点,并且你可能会在一段时间后耗尽内存.如果从外部程序调用代码(如果代码在库中),则同样如此.

旁白:不释放缓冲区可以(临时)一个有用的方法来检查,如果你在程序中得到崩溃从腐败的内存分配或释放(如果你不能使用Valgrind的)起源.但最终你想要释放一切,一次.

如果您只想执行一个malloc,您还可以分配一个大块,然后计算行的地址.最后,只需释放大块(例如:我们如何使用One malloc语句分配2-D数组)


ssd*_*ssd 6

你的代码不仅为指针数组(蓝色数组)分配内存,而且在for循环中,你也为红色数组分配内存.因此,free(array)单独行将释放蓝色数组分配的内存,但不释放红色内存.在与他们失去联系之前,你需要释放红色的; 也就是说,在释放蓝色阵列之前.

顺便说一下;

当其他东西需要访问它时,列的使用内存是否会被覆盖?

不会.操作系统将跟踪您的进程(程序)分配的内存,并且在您的进程终止之前不允许任何其他进程访问已分配的内存.在正常情况下 - 我的意思是,记住C语言没有垃圾收集器 - 操作系统永远不会知道你已经失去了与分配的内存空间的连接,并且永远不会尝试,"好吧,这个内存空间对这个过程没用再过;所以,让我们取消分配并为另一个过程服务."

在此输入图像描述