c - 使用方法链接时释放指针的正确方法
问题描述
我目前正在用 c 编写多种不同的矩阵乘法实现。所以我写了矩阵加法和减法的实用函数,其结构如下:
int** m_sub(int** a, int** b, int size) {
int **result = get_matrix(size);
// calculate addition of a & b
return result;
}
和get_matrix():
int** get_matrix(int size){
int** m = malloc(size*sizeof(int));
for (int i=0;i<size;i++){
m[i] = malloc(size*sizeof(int));
}
return m;
}
我设计了所有可以使用和返回的函数,int**
因为据我了解,您不能在 c 中返回可变大小的二维数组。
现在程序可以正常工作,但是通过运行内存检查器(Valgrind),我发现调用的所有返回值m_add
都导致内存泄漏,因为我直接在方法链接中使用返回值而我没有free()
他们,例如:
m_copy(c_11,m_add(matmul_recursive(n/2, a,e),matmul_recursive(n/2, b, g), n/2), n/2);
我知道我可以通过将每个返回的变量分配int**
给一个变量并在之后手动释放它来解决这个问题。但是,这将导致大量临时分配的变量,因此(可以说)代码的可读性降低。
现在我想知道在c中是否有一种“正确”的方式来做到这一点?还是我返回int**
矩阵指针的事实已经是一个糟糕的设计选择?
解决方案
问题是 C 没有自动析构函数调用的概念,就像 C++ 一样。因此,AFAIK,作为程序员,您有责任释放已分配的任何内容。
当然,您可以想象一个库,它保留对它分配的任何内容的引用,并提供一种在您不再需要它时释放它的方法。例如,您可以实现一个动态堆栈来存储每个新分配的内存块,然后使用该堆栈来回收整个内存。
只是我懒得写它的实现......但如果你觉得你想这样做但不能从一开始就实现它,请随时在评论中联系我。
推荐阅读
- excel - VBA 正则表达式 - 使用 \b 并在单词边界的末尾包含“-”
- gradle - 将 Karate DSL 与 gradle 和 Junit5 runner 一起使用的有效方法是什么
- javascript - 在点击位置对齐弹出框 React antd
- c# - 使用令牌 C# 发布
- docker - 如何在 MacOS 上不打开 Docker Desktop 的情况下启动应用程序 Docker?
- c# - 异步友好,跨进程读/写锁 - .NET
- html - 使用 CSS/HTML 圆角正方形的角并在其中插入线条
- neo4j - Neo4j cypher:返回连接到两个节点和仅两个节点的所有节点
- python - 使用 Trie 在标记化的句子中搜索短语
- c++ - 尝试使用指针遍历数组,但出现浮点指针错误/无法编译