我已经几乎完成了我的第一份工作的Symbian应用程序,但在我赶紧学习已经很少注意内存管理,推动并清理堆栈?

可能有人请指出我的一些最佳实践的方向用在这里,也许有些最好的泄漏检测/内存分析工具。

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

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

..一切?

感谢,并请原谅我,我是一个自我承认塞班的n00b。

有帮助吗?

解决方案

我在过去使用 HookLogger从塞班来跟踪和调查内存泄漏。这是不是最好的,但它肯定不会帮助。此外,堆标记提高ALLOC恐慌中的内存泄漏的情况下,只要你退出你的应用程序。这些危机中所提供的信息是勉强有帮助的,但它是很好的迹象,存在内存泄漏的地方。从那里,可以使用像HookLogger工具来缩小上泄漏在得到引入的代码的哪个部分。

我提到在回答几个Symbian的资源此主题 。虽然所有这些本来是最有用的对我来说,我没有找到这本书的 Symbian认证开发工程师入门的巨大的帮助。如果你能得到你的手就可以了,我肯定会推荐它。这是一个快速阅读,但它精辟地解释了概念,包括内存管理和描述的东西。

其他提示

存储在栈上的东西不需要被存储在清除栈上(除非它们需要特殊处理(R类等,见下文))

清除栈是用于当在假(认为异常)发生,否则泄漏存储器中删除对象。

清除栈的实际使用是通过静态功能清理栈:: PushL(..)和清理栈::流行音乐/ PopAndDestroy。

一些类如的RFile,RFS不得不关闭,而不是删除,所以对于这些函数调用其::关闭功能,所以你应该使用全局函数CleanupClosePushL(),这不是调用你的对象delete运算符免洗,它调用类::关闭函数来代替。

要检查你的代码的内存泄漏,您可以使用宏__UHEAP_MARK;和__UHEAP_MARKEND;这将确认没有被留在来自这两个呼叫之间的堆。

如果您在CActive类的::在RunL留在清理栈什么,活动调度会恐慌。

作为一般的技术中,如果要调用的的功能可以离开,(由一个附加的“L”表示),那么anythign必须删除或关闭(等)应该被添加到清理堆栈。

这需要下10页一点点正确exmplain所有你需要知道的关于清理栈和内存管理的Symbian C ++。

无耻插头:这本书对你n00bness的水平而编写的: http://www.quickrecipesonsymbianos.com

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top