案例
C/C++把内存管理交给程序员,由于对象生命周期的长短不一,需要记住内存在真正不需要它的时候显示释放,让程序员承担很大的心智负担,不经意间就出现内存泄露。通常正常的业务流程是不会出现内存泄露的,因为跑用例时会挂上内存检测工具,但一些异常分支,用例难以覆盖的地方,是内存泄露的重灾区。若一旦出现,都难以定位。前一段时间走读某一老产品的代码,是C/C++混合代码,发现一些潜在内存泄露问题。
问题1,每个异常分支需要手动释放方法内申请的内存,代码脱敏如下:
pBuf1 = malloc(sizeof(XX1)); // 申请一块内存
if (cond1) { // 异常分支1
free(pBuf1);
return RET_ERROR;
}
// 省略其它代码
pBuf2 = malloc(sizeof(XX2)); // 申请另一块内存
if (cond2) { // 异常分支2
free(pBuf1); // 每个分支,都要释放前面所有代码
free(pBuf2);
return RET_ERROR;
}
// 省略其它代码
ptr->buf1 = pBuf1; // 把多块内存的指针赋值给结构体指针ptr的成员变量,ptr是出参,ptr内存以及它的成员指针内存释放是在其它地方
ptr->buf2 = pBuf2;
return RET_SUCCESS