Symbian 开发的22条军规
2010-05-31 20:16:00 来源:WEB开发网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
- ››开发Android 日历教程
- ››开发学院总结 Win 8实用技巧大全
- ››开发学院原创教程:把win8的IE10放桌面上方法(非...
- ››开发者眼中的Windows Phone和Android
- ››Symbian S60 SocketConnection参数
- ››开发学院教你用SQL 语句最快速清空MySQL 数据表的...
- ››Symbian乏力:2010年诺基亚悲情大事记
- ››Symbian三大升级开启2011年新战略
- ››Symbian/Android/iOS/WM安装包对比
- ››Symbian一个活动对象的测试例子
- ››Symbian ListBox控件
- ››Symbian下自动切换SDK的批处理代码
更多精彩
赞助商链接