您的位置:首页 > 移动开发

Symbian编程总结-基础篇-集合与缓冲区(2)-验证RArray::Append是否保存对象副本

2008-11-20 16:51 344 查看
本文章由杨芹勍原创,如需转载请注明出处。谢谢!

一、验证栈对象会自动销毁

我们知道,在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<TFixedBufC> 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<TFixedBufC> 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方法创建了对象的副本并保存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐