首页 > 解决方案 > 在 c 中释放 2d 矩阵时正确使用 free()

问题描述

我刚刚开始学习用 c 编码,我对结合 free() 命令的 2d 矩阵有一些疑问。

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

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

array[n] = (double *) malloc(6*sizeof(double));

我知道然后解除分配此矩阵的正确方法是首先解除分配各个行,然后解除分配数组指针本身。类似于以下内容:

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

free(array);

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

任何帮助深表感谢!

标签: carraysmemory-managementmallocfree

解决方案


它不会导致损坏,不,但会造成内存泄漏

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

另外:不释放缓冲区可能是一种有用的方法(暂时)检查您在程序中遇到的崩溃是否源自损坏的内存分配或释放(当您无法使用 Valgrind 时)。但最终你想释放一切,一次

如果你只想执行一个malloc,你也可以分配一大块,然后计算行的地址。最后,只需释放大块(此处示例:我们如何使用 One malloc 语句分配二维数组


推荐阅读