一、验证栈对象会自动销毁
我们知道,在c++中,在函数中创建了栈对象,函数退出时,该栈对象会自动销毁(栈指针后移了,栈内存会被覆盖)。如何验证这一点?我们需要在函数外定义一个整形变量,在函数内将该函数内获取了变量的地址,在函数调用完毕后,将地址还原成对象:
tint iaddr;
/**
* 将地址还原成描述符对象并显示出来
* @param aaddr 地址
*/
local_c void printstring(tint aaddr)
{
const tbufc<50>& str = *((tbuf<50>*)aaddr);
console->write(str);
}
local_c void dotest()
{
_lit(kstring, "test string");
tbufc<50> str(kstring);
// 获取栈对象str的地址:
iaddr = (tint)&str;
printstring(iaddr); // 此处可以正常显示出“test string”
}
local_c void mainl()
{
dotest();
printstring(iaddr); // 此处显示乱码,证明栈对象会自动销毁
}
二、试验:rarray::append方法会保存对象的副本
typedef tbufc<20> tfixedbufc;
rarray iarr;
local_c void doinsert()
{
tfixedbufc text1(_l("test1"));
iarr.append(text1);
}
local_c void mainl()
{
doinsert();
tfixedbufc& desc = iarr[0">;
console->write(desc);
}
输出结果:
按照第一点分析,doinsert函数内的栈对象text1会在doinsert函数返回的时候被自动销毁,如果rarray::append方法只是简单的保存了text1的引用的话,程序不可能能够正确的输出test1。所以,我们通过此试验证明append方法中构建了一个text1的副本。
三、证明:rarray::append方法会保存对象的副本
typedef tbufc<20> tfixedbufc;
rarray iarr;
local_c void doinsert()
{
tfixedbufc text1(_l("test1"));
tbuf<50> addrstr;
// 获取text1的地址
addrstr.appendnum((tint)&text1);
iarr.append(addrstr);
console->write(addrstr);
console->write(_l("n"));
}
local_c void mainl()
{
doinsert();
tfixedbufc& desc = iarr[0">;
tbuf<50> addrstr;
// 获取desc的地址
addrstr.appendnum((tint)&desc);
console->write(addrstr);
}
我在函数doinsert内获取了描述符text1的地址并显示,并将描述符text1使用rarray::append方法添加到了集合内,在mainl方法内获取了集合第一个元素的引用并将该引用的地址输出。大家可以看到,输出的两个地址并不相同,从而证明了rarray::append方法创建了对象的副本并保存。
如果喜欢symbian编程总结-基础篇-集合与缓冲区请收藏或告诉您的好朋友.