本文共 2247 字,大约阅读时间需要 7 分钟。
在创建实例的时候Symbian C++使用 new (ELeave) 来代替普通的 new , 比如:CBar *pBar = new (ELeave) CBar;这个用法是考虑到手机特殊的属性:内存一般较小, 经常会有内存不足的情况出现。 在pc上如果内存不足我们就会退出程序, 但是在手机不能那样频繁的退出, 所以内存不足被划分为异常, 需要离开. 下面这个函数就会在内存不足的时候在A行离开: void FooBarL() { CBar *pBar = new (ELeave) CBar; //AUser::LeaveIfError(pBar->Foo()); //Bdelete pBar; //C}离开 作为异常处理的机制, 存在着一个问题。如果上面这个程序在B行Foo()返回了一个错误值,就会在那一行离开,但是系统为pBar指针分配的内存也就泄漏了。为了解决这个问题, Symbian 程序中频繁使用CleanupStack(清洁栈). 它的典型使用方式如下: void FooBarL() { CBar *pBar = new (ELeave) CBar; //ACleanupStack::PushL(pBar); User::LeaveIfError(pBar->Foo()); //BCleanupStack::Pop();delete pBar; //C }他的作用就是, 在B行之前, 把pBar指针放到清洁栈上, 一旦B行离开了,清洁栈就会自动删除pBar回收内存, 如果B行顺利通过, 就可以通过pop把pBar拿下来了。 CleanupStack 有效地解决了这个潜在的内存泄漏问题, 但是这个方法在一个特殊的情况下不适用。 那就是如果一个类的构建函数离开, 那么new 为它分配的内存就会泄漏。 (构建的顺序是:系统分配内存,然后运行构建函数) 这个问题就导入了下一个概念:two-phase construction (二层构建) 我们的目标是:构建函数在任何情况下不可以离开! 要实现它就必须:1。 不在构建函数里使用任何L函数2。 不在构建函数里分配内存凡是需要以上两个操作的都放到第二层构建函数中:ConstructL. 要把两层构建结合起来,我们需要另一个静态函数,一般为NewL或者NewLC. L大家都知道代表离开,C代表清洁栈, 下面会详细讲解NewLC的方便之处。(在这里向大家推荐一个很不错的英文Symbian 资料网站: :)二层构建的基本模式就是:CHelloWorldBasicAppView* CHelloWorldBasicAppView::NewL(const TRect& aRect) { CHelloWorldBasicAppView* self = CHelloWorldBasicAppView::NewLC(aRect);CleanupStack::Pop(self);return self;}CHelloWorldBasicAppView* CHelloWorldBasicAppView::NewLC(const TRect& aRect) { CHelloWorldBasicAppView* self = new (ELeave) CHelloWorldBasicAppView; CleanupStack::PushL(self);self->ConstructL(aRect);return self;}void CHelloWorldBasicAppView::ConstructL(const TRect& aRect) { // Create a window for this application viewCreateWindowL();// Set the windows size SetRect(aRect);// Activate the window, which makes it ready to be drawn ActivateL();}先看NewLC函数, 它创建一个CHelloWorldBasicAppView的实例, 然后把他放在清洁栈上,然后调用它的第二层构建函数(可以离开的), 然后并没有把实例从清洁栈上取下就返回了。这样的好处就是如果我们用NewLC创建一个对象,然后调用它的可以离开的函数就不必把它放到清洁栈上,因为它已经在上面了。NewL的功能和NewLC 是一样的,只是在返回实例前把它取下清洁栈。一般的C类都提供NewL,不是所有的C类都会提供NewLC. 使用清洁栈需要注意:1. 成员变量一般不需要放在清洁栈上, 因为当执行可离开的成员函数时,它们所在的类的实例本身就应该放在清洁栈上。 所有的成员变量所占的资源都和此实例共存亡。 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126298/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10294527/viewspace-126298/