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指针

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