Symbian中窥探C++编程功底

本文探讨了C++中从函数返回MyString对象时,使用栈与堆的不同方式及可能引发的问题。通过实例对比,解释了直接返回栈上创建的对象可能导致的内存问题,并给出了正确的实现方法。

MyString& StrUtil::newMyStringfromTDesC16(TDesC16& aDesC16)
{
HBufC8* hBuf8 = HBufC8::New(aDesC16.Length() * 3);
MyString ret;

if (hBuf8)
{
TPtr8 aPtr8(hBuf8->Des());
TInt cvtResult = CnvUtfConverter::ConvertFromUnicodeToUtf8(aPtr8, aDesC16);

ret.assign((const char *)(hBuf8->Ptr()), hBuf8->Size());
if (cvtResult != 0)
{
}

delete hBuf8;
hBuf8 = NULL;
}

return ret;
}

我们知道,C++中的内存分为堆和栈(忽略全局变量区ect),栈是存放临时变量的,栈内的资源在生命周期结束后会被释放掉。之所以这样做,是因为栈的资源一般来说是非常有限的。

那么上面那段程序中MyString ret;这句是在栈上建立一个临时对象

然后return ret;这句返回这个临时对象

但是不幸的是,ret遇到下面的}时生命周期结束,于是被释放掉!所以这段程序的返回值指向了一段已经被释放了的内存区域,于是出现不可知的bug。

改成下面即可:

MyString& StrUtil::newMyStringfromTDesC16(TDesC16& aDesC16)
{
HBufC8* hBuf8 = HBufC8::New(aDesC16.Length() * 3);
MyString *ret = new MyString();

if (hBuf8)
{
TPtr8 aPtr8(hBuf8->Des());
TInt cvtResult = CnvUtfConverter::ConvertFromUnicodeToUtf8(aPtr8, aDesC16);

ret->assign((const char *)(hBuf8->Ptr()), hBuf8->Size());
if (cvtResult != 0)
{
}

delete hBuf8;
hBuf8 = NULL;
}

return *ret;
}

MyString *ret = new MyString();是在堆空间里建立一个对象,而堆空间的资源必须由程序员显式的释放掉。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值