WEB开发网
开发学院手机开发Symbian 开发 Symbian 开发的22条军规 阅读

Symbian 开发的22条军规

 2010-05-31 20:16:00 来源:WEB开发网   
核心提示:elseUser::Leave(err);⒒、不要延迟将对象PushL()到CleanupStack上,所有新创建的对象(成员变量除外)应被立即压入该堆栈,Symbian 开发的22条军规(3),例如,下面的做法是错的:Void doExampleL(){CSomeObject* myObject1 = new (EL

else

User::Leave(err);

⒒、不要延迟将对象PushL()到CleanupStack上。所有新创建的对象(成员变量除外)应被立即压入该堆栈。例如,下面的做法是错的:

Void doExampleL()

{

CSomeObject* myObject1 = new (ELeave)CSomeObject;

CSomeObject* myObject2 = new (ELeave)CSomeObject;

//Do something here with the variables

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

14、编码中请勿使用_L()宏---而应使用_LIT()。_L()自Symbian OS

上一页  1 2 3 4 5  下一页

Tags:Symbian 开发 军规

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