关于CParser的内存泄漏问题

a14776584 2009-03-03 03:09:20
本人用CParser进行XML进行解析,用HookLogger发现有内存泄漏,但是第三版模拟器在关闭应用程序时并不报Alloc的panic(即内存泄漏的错误),有知道的达人请帮忙解释一下;而且如果确实是内存泄漏的话,本人觉得应该是CParser这个类本身有问题,因为我该释放的资源全部释放了,HookLogger还是检测有2048左右大小的堆内存未释放,而且HookLogger指向的位置就是CParser的对象new出来的位置。
...全文
132 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yqtbenson 2009-03-12
  • 打赏
  • 举报
回复
我碰到跟LZ完全一样的问题,请问LZ最后如何解决这个问题了???
a14776584 2009-03-06
  • 打赏
  • 举报
回复
不好意思,可能我没说清楚,“模拟器不会检测到Alloc的panic”是指模拟器不会检测到由CParser引起的Alloc的panic,
我的模拟器一向很正常,只要有堆内存没释放就会提示Alloc panic的。
谢谢所有回帖的人,衷心感谢alex_hua的热心指导,结贴!
alex_hua 2009-03-05
  • 打赏
  • 举报
回复
你最后的结论不对!模拟器肯定是可以检测出一般的、明显的内存泄漏的panic的~
你自己按下面再做一轮测试看看:
1. 写段程序,在初始化函数中调用User::Panic()。这样可以测试你模拟器的panic机制是否真的已启动
2. 验证1的前提下,重新写代码,在某个函数中,动态分配一对象,但不要去删除;这样可以验证你说的模拟器对内存泄漏是否会报panic
3. 在1、2的前提下,再测试你上面的代码,只要模拟器不报panic,你就没必要去查hooklogger为什么会报的了。就当它是正常的即可。
a14776584 2009-03-05
  • 打赏
  • 举报
回复
并且可以确定,模拟器不会检测到Alloc的panic(本人已按照alex_hua的方法修改了模拟器设置,特此感谢!),只有Hooklogger能检测出来有内存泄漏,本人sdk版本是9.1的
a14776584 2009-03-05
  • 打赏
  • 举报
回复
thanks alex_hua!
但是我确定9.1版本的CParser是有问题的,我新建了一个symbian3的hello world工程,代码
void CSymbian3AppView::ConstructL( const TRect& aRect )
{
CreateWindowL();
SetRect( aRect );
=> CParser * aParser = CParser::NewL(_L8("text/xml"), *this);
if (aParser)
{
delete aParser;
aParser = NULL;
}
ActivateL();
}
class CSymbian3AppView : public CCoeControl,MContentHandler
.
.
.
private: //Functions from MContentHandler
void OnStartDocumentL( const RDocumentParameters &aDocParam, TInt aErrorCode ) {};

void OnEndDocumentL( TInt aErrorCode ) {};

void OnStartElementL( const RTagInfo &aElement, const RAttributeArray &aAttributes, TInt aErrorCode ) {};

void OnEndElementL( const RTagInfo &aElement, TInt aErrorCode ) {};
.
.
.


一下是HookLogger检测到的内存泄漏:

heap 0a470000 : 0a470000
Bytes 2048
...
call Ordinal1 + 11404 -xmlparserplugin.dll! 23f148ff()
Ordinal1 + 12652 -xmlparserplugin.dll! 23f14ddf()
Ordinal1 + 1046 -xmlparserplugin.dll! 23f12089()
Ordinal1 + 728
Ordinal1 + 364
xmlparserplugin.dll! 23f1131d()
xmlparserplugin.dll! 23f110ed()
xmlparserplugin.dll! 23f1102d()
Ordinal23 + 6703 -ECom.dll! 51b4e09()
Ordinal22 + 3614 -ECom.dll! 51b329f()
Ordinal22 + 3104 -ECom.dll! 51b30a1()
Ordinal9 + 182
Ordinal45 + 4605 -XmlFramework.dll! 64d5ada()
Ordinal45 + 1155 -XmlFramework.dll! 64d4d60()
Ordinal28 + 272
Ordinal28 + 115
Ordinal27 + 61
=> CSymbian3AppView::ConstructL(class TRect const &) <D:\Symbian\Project\Symbian3\src\Symbian3appview.cpp #55> + 26
CSymbian3AppView::NewLC(class TRect const &) <D:\Symbian\Project\Symbian3\src\Symbian3appview.cpp #39>
CSymbian3AppView::NewL(class TRect const &) <D:\Symbian\Project\Symbian3\src\Symbian3appview.cpp #24> + 8

以上内容绝对属实,不信者可以自己实验
alex_hua 2009-03-04
  • 打赏
  • 举报
回复
怎么可能找不到呢!!!!

还有种方法,手工操作:
1. 在symbian的安装目录,打开\Epoc32\data\epoc.ini文件,添加一项 “JUSTINTIME 1”,或者将“JUSTINTIME 0”改为“JUSTINTIME 1”
2. 在\Epoc32\winscw\c\resource目录下,建个空文件,取名ErrRd(不要任何扩展名)
xiyangsl 2009-03-04
  • 打赏
  • 举报
回复
贴代码
a14776584 2009-03-04
  • 打赏
  • 举报
回复
hi,alex_hua,“模拟器Tools菜单选项下,将Just-in-time debugging和Extended panic code file打开~ ”,我的SDK是
9.1版本的,但是并没有找到这些选项
而且我自己又做了个实验,就CParser::NewL()了一个对象后,马上将其删除,结果还是有内存泄漏;而且我很奇怪,一般内存泄漏模拟器都会在关闭应用时报错,但这个没有。。。
xiyangsl 2009-03-03
  • 打赏
  • 举报
回复
同意楼上的,CParser这个类自身问题的可能性应该比较小。
xiyangsl 2009-03-03
  • 打赏
  • 举报
回复
Hi:
建议楼主贴出部分相关代码,方便大家帮助您查看。
“HookLogger指向的位置就是CParser的对象new出来的位置。”
照这样看,那应该是CParser对象可能没有被正确释放。你可以在这个对象new之后,记录下其内存地址,在内存窗口进行监控,看程序退出后是否被正确删除。
alex_hua 2009-03-03
  • 打赏
  • 举报
回复
模拟器Tools菜单选项下,将Just-in-time debugging和Extended panic code file打开~
对于内存泄漏问题,HookLogger是最拿手的了,CParser这个类本身不会有问题的,首先要怀疑自己的代码才好!

3,120

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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