c - 在 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) 会以任何方式导致内存损坏吗?
任何帮助深表感谢!
解决方案
它不会导致损坏,不,但会造成内存泄漏。
如果在您的程序中完成一次,它可能并不重要(许多专业/昂贵的应用程序都有 - 小的,无意的 - 内存泄漏),但在循环中重复此操作,一段时间后您可能会耗尽内存。如果您的代码是从外部程序调用的(如果您的代码在库中),则同样如此。
另外:不释放缓冲区可能是一种有用的方法(暂时)检查您在程序中遇到的崩溃是否源自损坏的内存分配或释放(当您无法使用 Valgrind 时)。但最终你想释放一切,一次。
如果你只想执行一个malloc
,你也可以分配一大块,然后计算行的地址。最后,只需释放大块(此处示例:我们如何使用 One malloc 语句分配二维数组)
推荐阅读
- actions-on-google - Google Actions:测试库抱怨 Firebase 条款
- python - 无法导入另一个同级目录中的python文件模块
- c++ - 函数指针指向的函数,返回指向同类型其他函数的函数指针
- c++ - 在 VSCode 上使用 F5 进行调试失败,提示“无法建立与 GDB 的连接”
- java - 如何在球衣中对动态资源使用 swagger 注释
- reactjs - 我如何解决 React useEffect 清理错误问题
- python - 我的最后一个 ouyput 在尝试 break staement 后继续循环,它继续这里是我在 python3 中的代码
- excel - 带有引用的 Excel VBA BuiltInDocumentProperties
- docker - 在 Windows 服务器上安装 Docker 时出错
- python - 在 aws lambda 中通过命令运行 python 脚本