Symbian基础总结 -- 验证RArray::Append是否保存对象副本

本文通过实验验证了C++中栈对象的自动销毁特性,并通过具体例子展示了RArray::Append方法如何通过创建副本而非引用的方式保存数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 原文出处: http://www.cnblogs.com/felixYeou/archive/2008/11/20/1337780.html

 

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

我们知道,在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); 
    }

输出结果:

image

按照第一点分析,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); 
    }

image

我在函数DoInsert内获取了描述符text1的地址并显示,并将描述符text1使用RArray::Append方法添加到了集合内,在MainL方法内获取了集合第一个元素的引用并将该引用的地址输出。大家可以看到,输出的两个地址并不相同,从而证明了RArray::Append方法创建了对象的副本并保存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值