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

请高手分析一下
...全文
1759 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nihao38 2009-11-20
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
OEM 可以问高通提SR呀,解决会很快的
zuoguangfang 2009-11-18
  • 打赏
  • 举报
回复
是的,brew3.1.5版本,主要是日程(vcalendar)的导入,导出.利用brew的相关接口。这个问题好像和每个property的字段长度有关,但不知道原因
  • 打赏
  • 举报
回复
哪个版本?好像和vCalendar 相关呀,你OEM再做相关的应用么
一、用户管理模块 身份认证 支持学生通过学号 + 密码(或统一身份认证系统)登录,管理员通过专属账号登录 实现密码加密存储、登录状态管理及自动登出功能 支持身份信息绑定(姓名、学院、联系方式等),确保预约身份唯一 权限管理 学生:仅可预约、取消座位及查看个人记录 管理员:拥有座位管理、用户管理、数据统计等全部权限 教师(可选):可申请专属座位或临时占用权限 二、自习室与座位管理模块 自习室基础信息管理 维护校内所有自习室信息:编号、名称、位置(教学楼 + 楼层)、总座位数、开放时间(工作日 / 周末差异化设置)、是否配备电源 / 空调等设施 支持自习室状态设置(正常开放 / 临时关闭 / 维护中),并同步展示给学生 座位信息管理 座位数字化建模:按自习室实际布局生成座位分布图(可可视化展示,如靠窗 / 靠过道、单座 / 连座等) 座位状态实时更新:空闲、已预约、已占用、故障(如桌椅损坏) 支持管理员标记故障座位并暂停预约,修复后恢复可用 三、预约与使用模块 座位预约 预约规则设置:可预约时段(如当天及次日,最多提前 3 天)、单次最长预约时长(如 4 小时)、每日预约次数限制 多方式预约:通过自习室列表选择、座位分布图直接点击选择、筛选条件(如带电源、靠窗)快速查找 预约确认:提交预约后生成唯一预约码(或二维码),同步发送短信 / 系统消息提醒 签到与签退 签到:学生到达后通过扫码(座位二维码)或输入预约码签到,超时未签到(如 15 分钟)自动释放座位 签退:结束使用后主动签退,系统记录实际使用时长;未主动签退则按预约结束时间自动签退 临时调整功能 续时:若座位后续无人预约,支持在结束前 30 分钟申请续时(最多 1 次,不超过场馆关闭时间) 取消预约:预约未开始前可取消,临近预约时间(如 30 分钟内)取消需限制次数(避免恶意占用)

5,379

社区成员

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

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