我已经完成了我的第一个Symbian应用程序的工作,但是在我的加速学习中很少关注内存管理并推动和清理堆栈?
有人可以指出我在这里使用的一些最佳实践的方向,也许是一些最好的泄漏检测/内存分析工具。
例如,如果我在函数内部获取TDesC或TPtrC16,我该如何以最佳方式清理它们,是否只是
TPtrC16 temp = ...
temp.CleanupClosePushL();
CleanupStack::PopAndDestroy()
..为了一切?
谢谢,请原谅我,我是一个自认为是Symbian n00b。
答案 0 :(得分:3)
我过去使用HookLogger from Symbian来跟踪和调查内存泄漏。它不是最好的,但确实有帮助。此外,每当退出应用程序时,堆标记会在内存泄漏的情况下引发ALLOC恐慌。这些恐慌提供的信息几乎没有帮助,但它很好地表明某处存在内存泄漏。从那里,你可以使用像HookLogger这样的工具来缩小泄漏引入的代码部分。
我提到了一些Symbian资源in reply to this thread。虽然所有这些对我来说都是最有用的,但我确实发现这本书Accredited Symbian Developer Primer非常有帮助。如果你能抓住它,我肯定会推荐它。这是一个快速阅读,但它精辟地解释了概念,包括有关内存管理和描述符的内容。
答案 1 :(得分:2)
存储在堆栈上的东西不需要存储在清理堆栈中(除非它们需要特殊处理(R类等,见下文))
清理堆栈用于在发生离开(思考异常)时删除对象,否则会泄漏内存。
清理栈的实际用途是通过静态函数CleanupStack :: PushL(..)和CleanupStack :: Pop / PopAndDestroy。
某些类(如RFile,RF)必须关闭而不是删除,因此对于这些函数调用了:: Close函数,因此您应该使用全局函数CleanupClosePushL(),而不是在对象上调用delete运算符请假,它会调用类':: Close函数。
要检查代码是否存在内存泄漏,可以使用宏__UHEAP_MARK;和__UHEAP_MARKEND;这将验证这两个调用之间堆上没有任何内容。
如果您在CActive的:: RunL中的cleanupstack上留下任何内容,则活动调度程序将会发生混乱。
作为一般技术,如果您正在调用的函数离开(由尾随'L'表示),那么必须删除或关闭的任何标志(等)应添加到清理堆栈。
答案 2 :(得分:1)
需要花费不到10页的时间才能正确地解释您需要了解的有关Symbian C ++的CleanupStack和内存管理的所有信息。
无耻的插件:这本书专门针对你的n00bness级别编写: http://www.quickrecipesonsymbianos.com