2

我已经差不多完成了我的第一个 Symbian 应用程序,但是在我匆忙的学习中,很少关注内存管理以及推送和清理堆栈?

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

例如,如果我在一个函数中抓取一个 TDesC 或 TPtrC16,那么我该如何清理它们是最好的方法,是不是很简单

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

..一切?

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

4

3 回答 3

3

我过去曾使用Symbian 的 HookLogger来跟踪和调查内存泄漏。这不是最好的,但它确实有帮助。此外,每当您退出应用程序时,堆标记会在内存泄漏的情况下引发 ALLOC 恐慌。这些恐慌提供的信息几乎没有帮助,但它很好地表明某处存在内存泄漏。从那里,您可以使用诸如 HookLogger 之类的工具来缩小泄漏被引入的代码部分。

I mentioned a few Symbian resources in reply to this thread. While all those have been most useful for me, I did find the book Accredited Symbian Developer Primer immensely helpful. If you could get your hands on it, I would definitely recommend it. It is a quick read, but it explains the concepts brilliantly, including things about memory management and descriptors.

于 2008-12-03T19:40:29.013 回答
2

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

清理堆栈用于在发生离开(认为异常)时删除对象,否则会泄漏内存。

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

一些类,如 RFile,RFs 必须关闭而不是删除,因此对于这些函数,它们的 ::Close 函数被调用,因此您应该使用全局函数 CleanupClosePushL(),而不是在离开时调用对象上的删除运算符,它改为调用类的 ::Close 函数。

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

如果您在 CActive 的::RunL 中的 cleanupstack 上留下任何内容,则活动调度程序将恐慌。

作为一种通用技术,如果您正在调用的函数可能会离开(用尾随的“L”表示),那么任何必须删除或关闭(等)的东西都应该添加到清理堆栈中。

于 2008-12-03T11:06:31.813 回答
1

它需要不到 10 页的篇幅来正确解释您需要了解的有关 Symbian C++ 的 CleanupStack 和内存管理的所有信息。

无耻插件:这本书是专门为你的n00bness水平写的: http ://www.quickrecipesonsymbianos.com

于 2008-12-03T14:30:21.277 回答