ivcalobject ivobjectparser iforcefeed接口内存问题

zuoguangfang 2009-11-17 09:31:56
用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就是内容变短
解析完成后就没有内存泄露了。

请高手分析一下
...全文
1685 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nihao38 2009-11-20
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
OEM 可以问高通提SR呀,解决会很快的
zuoguangfang 2009-11-18
  • 打赏
  • 举报
回复
是的,brew3.1.5版本,主要是日程(vcalendar)的导入,导出.利用brew的相关接口。这个问题好像和每个property的字段长度有关,但不知道原因
  • 打赏
  • 举报
回复
哪个版本?好像和vCalendar 相关呀,你OEM再做相关的应用么

2,851

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧