工作中遇到的申请内存问题分享给大家:
1、 资源申请释放没有放在同一层次或者不对称,例如:
VOID EFF_OnMain(IN ULONG uIfIndex,……)
{
VOS_Malloc(…..);
while(…..)
{
………
if(….)
{
VOS_Free(…);
return;
}
}
return;
}
上例在循环里释放内存,导致内存泄露。
推荐如下:
VOID EFF_OnMain(IN ULONG uIfIndex,……)
{
VOS_Malloc(…..);
while(…..)
{
………
if(….)
{
……..
break; //跳出循环
}
}
VOS_Free(….);
return;
}
2、 将申请的资源直接赋给间接变量(如数据结构字段、多级指针或全局变量),例如:
#define MAC_ADDRESS_LEN 6
#define MAC_LEN 14
*ppSendData=VOS_Malloc(MID_xxx,sizeof(UCHAR)* MAC_ADDRESS_LEN);
if(NULL== *ppSendData)
return VOS_ERR;
VOS_Mem_Copy(*ppSendData,aucMacAddr,MAC_LEN);
上例资源直接赋给了多级指针,推荐如下用法:
pTemdata=VOS_Malloc(MID_xxx,sizeof(UCHAR)* MAC_ADDRESS_LEN);
if(NULL== pTemdata)
return VOS_ERR;
VOS_Mem_Copy(pTemdata,aucMacAddr,MAC_LEN);
*ppSendData= pTemdata;//所有操作成功或结束后,挂载资源到相应的变量或数据结构。
再如下例子:
ULONG MWI_AddEntity(.......)
{
//为数据结构申请内存
pstEntity->pstAuthInfo=VOSMalloc(.....);
if(NULL== pstEntity->pstAuthInfo)
return VOS_ERR;
VOS_Mem_Copy(pstEntity->pstAuthInfo,pstAuthInfo,sizeof(.....);
.......
if(NULL== pstEntity->pstLastData)//某种错误情况
return VOS_ERR;
}
上述代码中内存泄露,因为该资源申请后,立即被挂载到数据结构字段上了,可能导致资源信息丢失。
推荐如下:
ULONG MWI_AddEntity(.......)
{
//为数据结构申请内存
pstTemData=VOSMalloc(.....);
if(NULL== pstTemData)
return VOS_ERR;
VOS_Mem_Copy( pstTemData,pstAuthInfo,sizeof(.....);
.......
pstEntity->pstLastData =pstTemData;
if(NULL== pstEntity->pstLastData)//某种错误情况
return VOS_ERR;
}
应在所有操作成功后再操作(或赋值)挂载到数据结构,先申请资源到局部指针变量,再申请内存资源