低级错误案例集 内部公开 2 0 1 3 -5 -2 第1 页, 共7 6 页 TOP1 资源泄漏 资源泄漏(包括内存泄漏)是代码Review中最常见的错误之一,申请的每个资源必须明确由谁负责释放,何时释放,在何处释放;在异常/错误/返回处理中,保持清醒的头脑,清理战场
此处的资源还包括信号量、定时器、文件句柄等系统资源
1 【问题描述】 宏里面有return语句导致内存泄漏案例一
【问题分析】 1) 错误代码: /*定义宏MODEL_ASSERT_RETFAIL*/ #define MODEL_ASSERT_RETFAIL (X) { if(X不合法) return; } „
//do something MDSTrafficMsg* pMsg = VOS_AllocMsg( PID_MD, usLength ); if (NULL_PTR = = pMsg ) { return ; } MDSDataListenerMgr *pDataListener = MDSDataInitalListenerMgr(); MODEL_ASSERT_RETFAIL(pDataListener); 2)分析: 使用宏MODEL_ASSERT_RETFAIL检查pDataListener是否合法,如果不合法,则直接返回,一旦返回,将导致前面通过指针pMsg申请到的消息包资源泄漏
低级错误案例集 内部公开 2 0 1 3 -5 -2 第2 页, 共7 6 页 【纠正方法】 在宏MODEL_ASSERT_RETFAIL分支判断return前加上VOS_FreeMsg(PID_MD, pMsg ):该方法代码不够清晰,当用户看宏定义时,对VOS_FreeMsg(PID_MD, pMsg )不清楚还要跳回来看前面的代码
设定该宏有返回值(指针不为空返回VOS_True,否则为