使用结构的内存泄漏
Memory leak using structs
以下代码导致内存泄漏:
mat operator*(mat A,mat B) {
mat C;
int r,c;
C.ncol = B.ncol;
C.nrow = A.nrow;
C.val=(datatype**)malloc(sizeof(datatype*)*C.nrow);
if (C.val==0) {
printf("ERROR: malloc failed in 'mat operator*(mat A,mat B)', #1n");
C.nrow = 0;
}
for (r=0; r<C.nrow; r++) {
C.val[r] = (datatype*)malloc(sizeof(datatype)*C.ncol);
}
/* matrix multiplication calculations */
return C;
}
int makemat(mat *A,mat B) {
int i,j;
if ( ((*A).nrow!=B.nrow)||((*A).ncol!=B.ncol) ) {
printf("ERROR: incompatible matrix dimensions for A=B.n");
return 1;
}
for (i=0; i<(*A).nrow; i++) {
for (j=0; j<(*A).ncol; j++) {
(*A).val[i][j].tblflg = B.val[i][j].tblflg;
memcpy(&(*A).val[i][j].tname[0],&B.val[i][j].tname,namelen-1);
}
}
return 0;
}
int main() {
int i;
mat A;
mat B;
mat C;
mat D;
for (i=0; i<1e8; i++) {
/* I've tried doing D = A*B;
(makemat(&C,D)) { /* printf error */ }
but that doesn't work either
*/
if (makemat(&C,(A*B))) { printf("i: %in",i); return 1; }
}
printf("i: %in",i);
return 1;
}
代码终止于i=907174。我在operator*(mat A,mat B)
函数中遇到malloc故障,我认为这是由于内存泄漏造成的(任务管理器显示最大内存使用量)。有人能解释为什么会有内存泄漏吗(假设这实际上是prolem)?我必须释放mat
的A、B或C中的任何一个吗?从operator*
操作返回的mat
是否被释放,这可能是我的问题吗?谢谢你的帮助!
编辑:很抱歉忘记了makemat功能。它已添加到上面。
第二版:我试着去掉细节,使它更简洁。我能告诉你的唯一一个连续分配内存的函数是运算符*函数。返回的内存发生了什么?我该如何释放它(如果这确实是导致泄漏的原因——正如大卫在回答中所暗示的那样)?
由于代码中没有对free_mat
的调用,显而易见的答案是肯定的,您存在内存泄漏。我还可以假设您没有对makemat
的参数调用free_mat
,这意味着在operator*
内部获得的内存将被泄露。要么是这个,要么是你唯一没有提供的函数中的其他地方,顺便说一句,就是你在循环中调用的,你正在泄漏内存。
在operator*
声明中,为本地结构变量C
的成员分配内存。这会造成内存泄漏,因为一旦operator*
函数返回,就无法访问分配的内存。一种解决方案是在该函数之外分配内存,并将分配的内存传递给该函数,以便对其进行操作。另一种解决方法是不使用动态内存分配。
尽管如此,正如评论中所建议的,你最安全的选择是在用C++编码时忘记指针分配。使用具有自动内存分配的容器。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏