weixin_57974545 2022-05-02 16:53 采纳率: 100%
浏览 39
已结题

free指针时,无法释放内存泄漏

问题遇到的现象和发生背景

在一个结构体内嵌套一个结构体指针,给嵌套的结构体指针开辟空间,free时失败。

问题相关代码,请勿粘贴截图

typedef struct {
char *memory;
size_t size;
}MemoryStruct;

typedef struct{
Xml_cb cllbackFuntion;
void *pArgs; //for register buffer
MemoryStruct *pData;
char *KeySet;
MS_U32 u32KeySetSize;
}XML_PARSER_PARAM;

MS_BOOL _XML_Parse(MemoryStruct pData)
{
MS_BOOL bRet = FALSE;
MS_U32 u32SpecificKeySetSize;
XML_PARSER_PARAM *xData = NULL;
char *u8SpecificKeySet[]=
{
"cdbs:Root",
"cdbs:RootMenu",
"cdbs:Menu",
"cdbs:Image",
"cdbs:Text",
"cdbs:Table",
"cdbs:Head",
"cdbs:Content",
"cdbs:Title",
"cdbs:ColorMode",
"cdbs:ColorSelect",
"cdbs:ColorSectionS",
"cdbs:ColorSectionN",
"cdbs:ColorTitleS",
"cdbs:ColorTitleN",
"cdbs:ColorText",
"cdbs:ColorTableL",
"cdbs:ColorTableH",
"cdbs:ColorTableC",
};

u32SpecificKeySetSize = sizeof(u8SpecificKeySet)/sizeof(MS_U8*);
memset(&stxmlList, 0, sizeof(stXMLList));

xData = (XML_PARSER_PARAM *)malloc( sizeof(XML_PARSER_PARAM) );
if(xData == NULL)
    goto fail;
xData->pData = (MemoryStruct *)malloc( sizeof(MemoryStruct) );

if(xData->pData == NULL)
    goto fail;

xData->cllbackFuntion = _XML_Cuba_List;
xData->pArgs = &stxmlList;
xData->pData->size = pData.size;
xData->pData->memory = pData.memory;
xData->KeySet = (char*)u8SpecificKeySet;
xData->u32KeySetSize = u32SpecificKeySetSize;
bRet = App_XMLParser(xData);

free( (xData->pData) );
(xData->pData)=NULL;    
free( xData );    
 xData=NULL;

if(xData->pData==NULL)//----------->该指针不等于NULL,free失败
    printf("\n@@@@ xData->pData free succeed@@@@\n");
else
    printf("\n @@@ xData->pData free fail @@@@\n");

if(xData==NULL)
    printf("\n@@@@ xData free succeed@@@@\n");
else
    printf("\n @@@ xData free fail @@@@\n");
return bRet;


fail:
    if(xData->pData != NULL)
        free(xData->pData);
    if(xData != NULL)
        free(xData);
    return FALSE;

}

viod main(void)
{
MemoryStruct xmlData;
xmlData=Mapp_GetFile_Data(global_f,(U8 *)buf,sizeof(buf)/sizeof(char)-1);
_XML_Parse_Cuba(xmlData);
}

运行结果及报错内容

xData->pData free后没有变为NULL

我的解答思路和尝试过的方法
我想要达到的结果

xData->pData free后要变成NULL指针

展开全部

  • 写回答

1条回答 默认 最新

  • SmallAntJ 2022-05-02 21:17
    关注

    free(ptr) 不会改变 ptr 变量本身的值,调用 free() 后它仍然会指向相同的内存空间,但是此时该内存已无效,不能被使用。所以建议手动将 ptr 的值设置为 NULL。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    weixin_57974545 2022-05-02 23:42

    上面我在调用free后已经手动设为NULL,但是printf出来实际并不等于NULL

    回复
    SmallAntJ 回复 weixin_57974545 2022-05-03 00:35

    20行到23行运行完已经free成功了,当你把xData也是释放了以后,xData->pData指向的空间和指针pData都已经失效了,可能会等于任何值。我用不同编译器运行25到28行得到不同的结果,turbo C的结果是NULL,gcc没有任何输出,vs2017给了异常中断。你应该把25行到28行挪到22行的位置,如果xData都free了你再检查xData->pData就没有意义了。

    回复
    weixin_57974545 回复 SmallAntJ 2022-05-04 00:48

    确实是打印的地方放错了,放到22行的位置,打印出来就是NULL,谢谢

    回复
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 5月17日
  • 已采纳回答 5月9日
  • 创建了问题 5月2日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部