Symbian C++ — 描述符大集合

September 1st, 2010

  学习了Symbian C++的描述符之后,对标准C/C++对于定义字符串的风格无比怀念。最郁闷的是我只想定义一个常量字符串而不得不去定义一个类的实例,于是无形中又浪费了几个函数指针占用的内存。虽然也可以用字符指针来保存一个字符串,但是这种方式与Symbian C++的编程风格背道而驰,还是少用为妙。 Read the rest of this entry »

如何在21天内自学C++

September 1st, 2010

  长期以来不少同学们带着“计算机要从娃娃抓起”的坚定信念,纷纷走进“南祥技校”、“北太菜鸟”等计算机进修学校,或者捧起《像小贝一样学习C++》等书,企图自学成才。
  通往编程高手之路是崎岖而坎坷的,甚至连女朋友都要冷落一旁了。那么,有没有一条“终南捷径”,可以让我们在短时间内快速成才呢?以下的漫画就告诉了我们一条在21天内自学C++的“最简单方式”。 Read the rest of this entry »

Symbian C++ — 内存管理之“类的二阶段构造”

August 31st, 2010

  前面的清除栈机制保证了程序在异常退出后不会发生内存泄漏,而其前提是对象要能成功构造。如果在构造阶段出现异常则无法保证。为此,Symbian C++引入了类的二阶段构造的概念。在标准C++中,一个类的构造函数不仅包括对其自身成员变量的初始化,还可能包含其成员类对象的构造。Symbian C++通过二阶段构造把内存分配和调用构造函数分开,在这个过程中应用清除栈机制。从而能够在更早的阶段避免内存泄漏。 Read the rest of this entry »

Symbian C++ — 内存管理之“清除栈”

August 31st, 2010

  Symbian OS从一开始就定位于手持设备,具有极度有限的资源。因此相对于PC操作系统来说,其对防止内存汇漏这种问题更为苛刻。于是Symbian设计了一套严格的机制来保障内存不会泄漏——清除栈(CleanupStack)。 Read the rest of this entry »

Symbian C++ — 对operator new的一点小疑问

August 31st, 2010

在symbian C++中要构造一个对象通常采用以下这种方式:

CMyClass * myClass = new (ELeave) CMyClass;

这里的new跟普通C++中的new不同,这里的new是一个new operator的重载版,其定义为:

// Global leaving operator new
inline TAny* operator new(TUint aSize, TLeave)
{return User::AllocL(aSize);}
inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize)
{return User::AllocL(aSize + aExtraSize);}
#if !defined(__VC32__) || defined (__MSVCDOTNET__)
inline TAny* operator new[](TUint aSize, TLeave)
{return User::AllocL(aSize);}
#endif

从上面的代码可以看出TLeave这个枚举变量的值在最终分配内存的时候根本就没用到,而sdk源码中对AllocL的注释如下:

Allocates a cell of specified size from the current thread‘s heap, and leaves if there is insufficient memory in the heap.

看到这里就更迷惑了,既然调用AllocL在分配内存失败的时候会leave,而前面根本没有通过把TLeave的值传给你指示你要不要leave,也就是说无论传给TLeave的值为多少,在内存分配失败的时候总会自动leave,既然如此,还搞个ELeave干啥用??