WEB开发网
开发学院手机开发Symbian 开发 symbian 开发诀窍大放送 阅读

symbian 开发诀窍大放送

 2010-02-23 16:06:00 来源:WEB开发网   
核心提示:{CSomeObject* myObject1=new (ELeave)CSomeObject;CSomeObject* myObject2=new (ELeave)CSomeObject;…// Do something here with thevariablesCleanupStack::PushL(myObje

{

CSomeObject* myObject1=new (ELeave)CSomeObject;

CSomeObject* myObject2=new (ELeave)CSomeObject;…

// Do something here with thevariables

CleanupStack::PushL(myObject1);

CleanupStack::PushL(myObject2);

// Do something more with the variables…

CleanupStack::PopAndDestroy(2);

// myObject2, myObject1

}

因为myObject2 的创建可能失败,造成myObject1“悬”在那里不能被清理。应该这样来实现:

void doExampleL()

{

CSomeObject* myObject1=new (ELeave)CSomeObject;

CleanupStack::PushL(myObject1);

CSomeObject* myObject2=new (ELeave)CSomeObject;

CleanupStack::PushL(myObject2);

// Do something here with the variables…

CleanupStack::PopAndDestroy(2);

// myObject2, myObject1

}

12. 注意,那些名称有大写字母C 结尾的函数(例如NewLC())会自动把其对象置于CleanupStack。您不应该自己来将这些对象压入CleanupStack,否则该对象会入栈两次。当您创建非成员变量并为其分配内存时,这些由C 结尾的函数很有用。

13.“两段构造方法”是Symbian OS 内存管理的关键部分。基本原则是Symbian OS 中的构造函数或析构函数永远不应该发生Leave。倘若一个C++ 构造函数Leave,构造过程未完成的对象得不到清理,因为还没有生成指针指向该对象。为此,SymbianOS 中的构造函数仅将该对象实例化,而后调用该对象的ConstructL()函数,在其中将成员数据实例化。一旦ConstructL()发生Leave,标准的析构函数将被调用来清除所有至此已被成功分配的成员变量。在您的编码中照用这一设计模式来防止内存泄漏,至为关键。当您写每一行代码时,都应该问自己:“ 这一行代码能否发生Leave ?”假如回答为“是”,则应考虑“是否所有资源都将被释放?”。

14. 编码中请勿使用_L()宏——而应使用_LIT()。_L()自Symbian OS v5 起已是‘不推荐使用’(deprecated),它的问题在于它将调用TPtrC(const TText*)构造函数,该构造函数会调用strlen()函数来计算该字串的长度。虽然这不会带来额外的RAM 开销,却会在运行时占用更多CPU

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:symbian 开发 诀窍

编辑录入:coldstar [复制链接] [打 印]
赞助商链接