我从以下代码中收到内存泄漏:
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)', #1\n");
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: %i\n",i); return 1; }
}
printf("i: %i\n",i);
return 1;
}
代码终止于i = 907174。我在operator*(mat A,mat B)
函数中遇到malloc失败,我假设是由于内存泄漏(任务管理器最多显示内存使用情况)。任何人都可以解释为什么存在内存泄漏(假设事实上是问题)?我是否必须释放任何mat
的A,B或C?从mat
操作返回的operator*
是否会被释放,这可能是我的问题吗?谢谢你的帮助!
EDIT2:我试图弄清楚细节并使其更加简洁。我可以告诉的唯一一个不断分配内存的函数是operator *函数。返回记忆会发生什么,我怎么能释放它(如果这确实是造成泄漏的原因 - 正如大卫在答案中提到的那样)?
答案 0 :(得分:2)
由于代码中没有调用free_mat
,显而易见的答案是肯定的,你有内存泄漏。我还可以假设你没有在free_mat
的参数上调用makemat
,这意味着在operator*
内获得的内存将被泄露。在你没有提供的唯一函数中的其他地方或者其他地方,你在循环中调用的是你正在泄漏的内存。
答案 1 :(得分:0)
在operator*
声明中,为本地结构变量C
的成员分配内存。这会产生内存泄漏,因为operator*
函数返回后无法访问此分配的内存。解决方案是在此函数之外分配此内存,并将分配的内存传递给函数,以便对其执行操作。另一种解决方案是不使用动态内存分配。
所有这一切,正如评论中所建议的那样,最安全的选择是忘记指针分配,而用C ++编码。使用具有自动内存分配的容器。