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就是内容变短
解析完成后就没有内存泄露了。

请高手分析一下
...全文
1746 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nihao38 2009-11-20
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
OEM 可以问高通提SR呀,解决会很快的
zuoguangfang 2009-11-18
  • 打赏
  • 举报
回复
是的,brew3.1.5版本,主要是日程(vcalendar)的导入,导出.利用brew的相关接口。这个问题好像和每个property的字段长度有关,但不知道原因
  • 打赏
  • 举报
回复
哪个版本?好像和vCalendar 相关呀,你OEM再做相关的应用么
资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 四路20秒声光显示计分抢答器Multisim14仿真源文件+设计文档资料摘要 数字抢答器由主体电路与扩展电路组成。优先编码电路、锁存器、译码电路将参赛队的输入信号在显示器上输出;用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。经过布线、焊接、调试等工作后数字抢答器成形。关键字:开关阵列电路;触发锁存电路;解锁电路;编码电路;显示电路 一、设计目的 本设计是利用已学过的数电知识,设计的4人抢答器。(1)重温自己已学过的数电知识;(2)掌握数字集成电路的设计方法和原理;(3)通过完成该设计任务掌握实际问题的逻辑分析,学会对实际问题进行逻辑状态分配、化简;(4)掌握数字电路各部分电路与总体电路的设计、调试、模拟仿真方法。 二、整体设计 (一)设计任务与要求: 抢答器同时供4名选手或4个代表队比赛,分别用4个按钮S0 ~ S3表示。 设置一个系统清除和抢答控制开关S,该开关由主持人控制。 抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在LED数码管上显示,同时扬声器发出报警声响提示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。 参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。 如果定时时间已到,无人抢答,本次抢答无效。 (二)设计原理与参考电路 抢答器的组成框图如下图所示。它主要由开关阵列电路、触发锁存电路、解锁电路、编码电路和显示电路等几部分组成。

3,202

社区成员

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

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