symbian 内存泄露检查心得
2010-06-03 01:25:00 来源:WEB开发网Symbian软件开发到了一个阶段,内存泄露检查是必须要做的,因为Symbian提供了严格的内存检查机制,有任何内存泄露,程序退出或运行过程中会弹出提示。如果置之不理,签名时必然过不了。
Symbian系统有非常好的内存泄露检查工具HookLogger,上一篇文章已经详细的介绍了安装及使用方法,这里不再赘述。今天主要介绍下代码中容易出现内存泄露的地方,记录一下心得体会。
一,Symbian系统采用C++语言,像所有C++一样,new完之后没有delete,依然是代码中出现内存泄露的主要原因。这需要有良好的编码习惯与扎实的编程基础才能避免。每一个类,函数中的指针一定要仔细检查,如果从堆中分配过内存,一定要在适合的地方释放,成员指针最好在构造中置空,在析构中释放,免得忘记。
char *p =NULL
if (!p)
p = new char[6];
.............
if (p)
{
delete p;
p = NULL;
}
以上是很好的编码风格,如果直接delete p,会发生很多不可预知的问题。
二,CTypefaceStore -14 错误。
GetNearestFontInTwips和ReleaseFont必须成对出现,
使用CGraphicsDevice及其集成类的GetNearestFontInTwips 等方法创建自定义字体的时候,
使用完字体要调用一下ReleaseFont 释放 该字体。
类似函数还有GetNearestFontToDesignHeightInTwips(), GetNearestFontToMaxHeightInTwips(),
如果是CFbsDevice等,还有这些函数
GetFontById()
GetNearestFontToMaxHeightInPixels()
GetNearestFontInPixels()
GetNearestFontToDesignHeightInPixels()
GetNearestFontToMaxHeightInPixels()也需要relesefont
三,RPointerArray是Symbian中特有的数据类型,实际上它是一个class,内部返回一个Array的一个指针。 RPointerArray有非常好的释放内存的方法ResetAndDestroy(),这个函数可以多次使用,安全的释放RPointerArray 的内存。但有一种情况,如果array中Append的是new过的一个指针,这个指针有可能是个Class,也可能是个struct,Class或 struct中有堆中分配的内存,则这些内存需要手动释放。
四,描述符的使用。Symbian的描述符和C++的String操作还是有很多不同,有很多内部规则,如HBufC8的使用,AllocL的使用等等,需要深刻理解内部机制,写出的代码才会足够健壮。
先写这么多,还有很多没有遇到过的问题,想起来再添上。
更多精彩
赞助商链接