初学 symbian 一路走来
2010-03-05 06:06:00 来源:WEB开发网HBufC对于那些需要为容纳不会改变的数据而动态分配的描述符来说还是相当理想的;也就是说如果是不改变数据的访问的话,它还是不错的。
使用RBuf
RBuf对象可以通过Create()、CreateMax()或CreateL()方法来创建,并可以指定所能存储的描述符数据的最大长度。也可以先实例化一个RBuf,然后将另一个描述符的内容复制进去,如下所示:
RBuf myRBuf;
LIT(KHelloRBuf, "Hello RBuf!"); // Literal descriptor
myRBuf.CreateL(KHelloRBuf());
CreateL()为RBuf分配了一段缓存来引用。如果RBuf之前拥有一段缓存,由于CreateL()在分配新的缓存引用前不会将其清除,所以必须先调用Close()来释放先前拥有的内存。
另一种方法是先实例化RBuf,然后再用Assign()方法取得一段已存在内存的所有权。
// Taking ownership of HBufC
HBufC* myHBufC = HBufC::NewL(20);
RBuf myRBuf;
myRBuf.Assign(myHBufC);
Assign()也会使RBuf已经拥有的数据孤立,所以在重新指定之前要调用Close()来避免内存泄漏。
在特定操作需要更多内存时,RBuf类不会去操纵缓存的大小或者为它重新分配内存。如果一个可变的方法——比如Append()——在没有足够可用内存时被RBuf对象调用,那么将会出现一个严重错误。作为程序员,您应该为保证RBuf对象在其缓存内有足够空间而负责,并可以在需要时使用ReAllocL()方法:
// myRBuf is the buffer to be resized e.g. for an Append() operation
myRBuf.CleanupClosePushL(); // push onto cleanup stack for leave-safety
myRBuf.ReAllocL(newLength); // extend to newLength
CleanupStack::Pop(); // remove from cleanup stack
注意上面的例子用到了CleanupClosePushL(),来把RBuf类推入清除栈。清除工作在调用Close()(或者是调用CleanupStack::PopAndDestroy(),当RBuf是通过调用RBuf::
Cleanup-ClosePushL()被推入清除栈时)时开始,这对于其他R类来说很常见。
字面描述符
字面描述符与其他描述符类型略有不同。它们相当于C 中的static const char[],并且由于它们是常量,所以可以被构建在ROM里以便在运行时节省内存。一组e32def.h中的宏可以用来定义Symbian OS的两种不同类型的字面文字,_LIT和_L。
更多精彩
赞助商链接