ivcalobject ivobjectparser iforcefeed接口内存问题
用brew的iobjectparser和iforcefeed接口实现对vcalendar文件的解析时,有一个奇怪的内存泄露问题:
解析代码如下:szFileName1 -- 传入的文件名 pIvCalObject在函数外释放
static int ParseObjectFromFile(ExploreApp* pMe,IvCalObject **pIvCalObject,char * szFileName1)
{
IFile *pIFile = NULL;
AEEFileInfoEx nInfo = {0};
int nTempBytes = 0;
int nBytesRead = 0;
AEECLSID dwObjectId = 0;
int nNumObjects = 0;
int nResult = AEE_SUCCESS;
char *pBuf = NULL,* pBufd = NULL;
IFileMgr * m_pFileMgr = NULL;
IForceFeed *pIForceFeed = NULL;
IvObjectParser *pIvObjectParser = NULL;
if((NULL == pIvCalObject) || (NULL == szFileName1)){
return AEE_EBADPARM;
}
do
{
if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_FILEMGR,(void **)&m_pFileMgr) != SUCCESS)
return 1;
pIFile = IFILEMGR_OpenFile(m_pFileMgr, szFileName1, _OFM_READ);
if(NULL == pIFile){
nResult = AEE_EFAILED;
break;
}
nInfo.nStructSize = sizeof(nInfo);
if(AEE_SUCCESS != IFILE_GetInfoEx(pIFile, &nInfo)){
nResult = AEE_EFAILED;
break;
}
pBuf = (char *) MALLOC(nInfo.dwSize + 1);
if(!pBuf){
nResult = AEE_ENOMEMORY;
break;
}
nTempBytes = nInfo.dwSize;
nBytesRead = IFILE_Read(pIFile,pBuf,nTempBytes);
if(nBytesRead != nTempBytes){
nResult = AEE_EFAILED;
break;
}
// start parsing the buffer.
if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_vObjectParser,(void **)&pIvObjectParser) != SUCCESS)
{
RELEASEIF(m_pFileMgr);
RELEASEIF(pIFile);
FREEIF(pBuf);
return AEE_EFAILED;
}
if(NULL == pIForceFeed){
if(AEE_SUCCESS != IvObjectParser_QueryInterface(pIvObjectParser,
AEEIID_FORCEFEED,
(void **)&pIForceFeed)){
nResult = AEE_EFAILED;
break;
}
} else {
IFORCEFEED_Reset(pIForceFeed);
}
nResult = IFORCEFEED_Write(pIForceFeed,
pBuf,
STRLEN(pBuf));
if(nResult)
break;
nResult = IFORCEFEED_Write(pIForceFeed,
NULL,
0);
// Geting number of parse object parse
if(nResult)
break;
nResult = IvObjectParser_GetNumberOfParsedObjects(pIvObjectP arser,
&nNumObjects,
&dwObjectId);
if( AEECLSID_vCalendar != dwObjectId ){
nResult = AEE_EFAILED;
break;
}
nResult = IvObjectParser_GetObjectAtIndex(pIvObjectParser,
0,
(IvObject **)pIvCalObject);
if(AEE_SUCCESS != nResult || NULL == pIvCalObject){
nResult = AEE_EFAILED;
break;
}
else
{
IFORCEFEED_Reset(pIForceFeed);
}
nResult = IvObjectParser_GetBufferFromIvObject(pIvObjectPars er,
(IvObject *)*pIvCalObject,
NULL,
0,
&nTempBytes);
if(AEE_SUCCESS != nResult || NULL == pIvCalObject){
nResult = AEE_EFAILED;
break;
}
pBufd = (char*)MALLOC(nTempBytes+1);
MEMSET(pBufd,0,nTempBytes+1);
nBytesRead = nTempBytes;
nResult = IvObjectParser_GetBufferFromIvObject(pIvObjectPars er,
(IvObject *)*pIvCalObject,
pBufd,
nBytesRead,
&nTempBytes);
}while(0);
RELEASEIF(pIForceFeed);
RELEASEIF(pIvObjectParser);
RELEASEIF(pIFile);
RELEASEIF(m_pFileMgr);
FREEIF(pBuf);
FREEIF(pBufd);
return nResult;
}
当解析如下的vcalendar文件时,手机总是提示有内存没释放
calendar_single.vcs is following:
BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
PRODID:vCal ID default
BEGIN:VEVENT
TRANSP:OPAQUE
UID:content://calendar/events/16
DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=E7=83=AD=E5=97=AF=E5=97=AF=E4=BD=A0=E8=A6=81=E4 =BD=A0=E6=98=AF=E4=B8=8D=E4=B8=8D
CLASS:PUBLIC
DTEND:20091109T141309Z
DTSTART:20091109T131309Z
LOCATION:78478937
COMPLETED:20091109T141309Z
DTSTAMP:20091109T131309Z
SUMMARY:jieaef
BEGIN:VALARM
ACTION:AUDIO
TRIGGER:-PT10M
END:VALARM
END:VEVENT
END:VCALENDAR
还是以上文件如果把DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=E7=83=AD=E5=97=AF=E5=97=AF=E4=BD=A0=E8=A6=81=E4 =BD=A0=E6=98=AF=E4=B8=8D=E4=B8=8D
字段改为DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=E7=83=AD=E5=97=AF就是内容变短
解析完成后就没有内存泄露了。
请高手分析一下