2008-12-03 33 views
2

我已经完成了我的第一个工作Symbian应用程序,但在我的急促学习中很少关注内存管理并推动和清理堆栈?针对Symbian C++的内存管理实践和工具

有人请指点一下这里使用的一些最佳实践的方向,也许是一些最好的泄漏检测/内存分析工具。

例如,如果我抢TDesC或函数内部TPtrC16,我怎么那么清除它们的最好方法,是单纯

TPtrC16 temp = ... 
temp.CleanupClosePushL(); 
CleanupStack::PopAndDestroy() 

..for一切吗?

谢谢,请原谅我,我自己承认Symbian n00b。存储在堆栈上

回答

3

我已经在过去使用HookLogger from Symbian跟踪和调查内存泄漏:这本书对你n00bness的水平而编写的。这不是最好的,但它确实有帮助。此外,每当退出应用程序时,堆内存标记都会引发ALLOC恐慌,以防内存泄漏。这些恐慌提供的信息几乎没有帮助,但很好地表明某处存在内存泄漏。从那里,你可以使用像HookLogger这样的工具来缩小泄漏引入的代码的哪一部分。

我提到了一些Symbian资源in reply to this thread。虽然所有这些对我来说都非常有用,但我确实发现Accredited Symbian Developer Primer这本书非常有帮助。如果你能掌握它,我肯定会推荐它。它是一个快速阅读,但它精辟地解释了这些概念,包括关于内存管理和描述符的内容。

2

事情并不需要被存储在清除栈中(除非它们需要特殊处理(R类等,见下文))

清除栈是删除对象时休假(思异常)发生,否则会泄漏内存。

清理栈的实际使用是通过静态函数CleanupStack :: PushL(..)和CleanupStack :: Pop/PopAndDestroy。

某些类如RFile,RFs必须关闭而不是删除,因此对于这些函数有:: Close函数调用,所以您应该使用全局函数CleanupClosePushL(),而不是在您的对象上调用delete运算符在休假时,它会调用类:: Close功能。

要检查你的代码的内存泄漏,你可以使用宏__UHEAP_MARK;和__UHEAP_MARKEND;这将验证在这两个调用之间没有任何东西留在堆上。

如果您在CActive's :: RunL的cleanupstack上留下任何内容,则活动调度程序将会发生混乱。作为一种常规技术,如果您要调用的函数可能为离开,(由后缀'L'表示),则必须将删除或关闭的任何关键(等)添加到清理堆栈中。