【问题标题】:Memory management practices and tools for Symbian C++Symbian C++ 的内存管理实践和工具
【发布时间】:2008-12-03 10:49:24
【问题描述】:

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

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

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

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

..所有的东西?

谢谢,请原谅我,我是自认的 Symbian n00b。

【问题讨论】:

    标签: c++ memory-management symbian s60


    【解决方案1】:

    我过去曾使用HookLogger from Symbian 来跟踪和调查内存泄漏。这不是最好的,但它确实有帮助。此外,当您退出应用程序时,如果内存泄漏,堆标记会引发 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 的::RunL 中的 cleanupstack 上留下任何内容,则活动调度程序将崩溃。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-05-29
          • 2011-06-25
          • 2013-11-19
          • 2012-03-28
          • 2013-12-05
          • 2012-04-22
          • 1970-01-01
          • 2011-05-04
          • 1970-01-01
          相关资源
          最近更新 更多