Win 程序员如何过度到Symbian程序员?

http://tech.ddvip.com   2008年06月15日    社区交流

内容摘要:本文讨论了当一个典型的Windows C++程序员初次接触Symbian操作系统时可能遇到的问题。我们开发过三个成功版本Symbian操作系统的经验使我们十分清楚在这个不算丰富稳定的环境中工作什么才是困难的。

  5.清洁栈及错误处理。

  Symbian操作系统的错误处理框架,主要是清洁栈,是个Windows程序员不太熟悉的元素。就像描述符一样,它很优雅,Symbian宣布它比C++语言的异常处理机制有效得多。在一篇叫做《Symbian操作系统编程术语》的文章里对此进行了很好的讨论,可以从http://www.symbian.com得到。但是,在系统层次上几乎是一定的“正确的事”却减慢了应用开发。Symbian为需要在有限资源条件下长时间运行的应用程序设计了这样一个框架,这需要在开发时间为强壮度付出代价。使用TRY/CATCH这种类型的框架当然是简单明了受到欢迎的,但是要频繁的在恰当的时候把已某种分配的内存压入和弹出清洁栈意味着你就会偶尔犯错误。当发生这种情况时,你就得花费大量的时间去追踪在你的代码中造成的不对称现象。

  作为一个对描述符和清洁栈不熟悉的程序员是如何陷入困境的例子,让我们简单的看看一个关于串的示例:_LIT(KBoilerplate, "Hello there, %S");TPtrC name = GetPointerIntoNameDescriptorWithoutAllocatingAnyMemory();TPtr finishedProduct = HBufC::NewLC(KBoilerplate()。Length() + name.Length())->Des();finishedProduct.Format(KBoilerplate(), &name);// 下面的就是缺少的一行——见之前的注释// CleanupStack::Pop();这段代码确实把内存推入了清洁栈,但仅仅是对变量的数据类型一瞥而过你就发现不了这一点。这是因为我们使用了一种便利的方法定义了一个TPtr来持有finishedProduct并把HBufC::NewLC(……)->Des()的值赋给它。HBufC是在堆上已分配内存的标识,但是如果我们仅仅看到了左边,可能就会忽略掉刚一分配我们就使用了Des()的快捷方式这一事实。NewLC也直接把分配的内存推入清洁栈。一旦我们完成了finishedProduct,最好调用CleanupStack::Pop(),否则我们的清洁栈就会不平衡。问题在于,我们可能起先发现不了这种不平衡,直到它引发错误为止。还有比追踪这种不对称更有趣的事情呢。

责编:豆豆技术应用

正在加载评论...