WSD in Symbian OS
WSD, Writable Static Data, 可写静态数据。大家在windows编程中可能常用到,在DLL中使用一些全局静态数据,以便在其他DLL或其他进程中共享访问。但是在Symbian中,因为内存开销太高,WSD是不推荐使用的。注意这种限制只存在于DLL中,如果你编写的是EXE是不会受到影响的。
全局WSD顾名思义是全局性的,包括在函数外面定义的变量,结构或类,以及一些函数内的静态数据。
TBufC<20> buf; //WSD
void SetBuf()
{
static Tint iLength; //WSD ...
}
注意WSD的声明一般不带const,不过看看下面的声明,
const TInt i=…; //OK – truly const
const TPtrC KPtrValue=...; //NOT OK – non trivial constructor
const TRgb KCol=...; //NOT OK – non trivial constructor
可见对一些内置类型,如TInt,使用const声明表示是真正的常量。但是如果是自定义类型,该对象尽管是不可改变,但编译器仍使用了一个变量来存储它。所以它仍然是WSD。
Symbian OS对WSD的支持
Symbian OS所有版本都支持EXE的全局WSD。
EKA2(8.1b之后)支持DLL的WSD,之前的版本不支持。
和其他资源一样,在程序里定义了WSD对象,就需要注意在程序退出时清除,以防资源的泄漏。
WSD对象的清除请注意下面两点:
1. 在EXE进程中定义的或者是其静态加载的DLL中定义的WSD需要清除,因为进程退出时Symbian OS不会自动调用这些WSD的析构函数
2. EXE进程使用RLibrary动态调用的DLL定义的WSD,不需要清除,因为进程退出时Symbian OS会自动调用它们的析构函数。