读书人

内存有关问题哪个老手来解释一上

发布时间: 2012-12-19 14:13:14 作者: rapoo

内存问题,哪个老手来解释一下

HBufC * iText;
const TDesC& GetTextEx() { return *iText; }

void CutString::SetTextEx( const TDesC & aText )
{
if(NULL != iTextArrayEx)
{
iTextArrayEx->Reset();
iTextArrayEx->Close();
delete iTextArrayEx;
iTextArrayEx = NULL;
}
iTextArrayEx = new (ELeave) RArray<TPtrC16>(3);

//***********************(1)
HBufC * textOld = iText;
iText = aText.Alloc();
if (NULL != textOld)
{
delete textOld;
textOld = NULL;
}
//***********************(2)
if (NULL != iText)
{
delete iText;
iText = NULL;
}
iText = aText.Alloc( );
}

在应用时出现了如下的现象:

对于代码(1):
if(help->GetText()!= NULL)
{
iCutStringHelp->SetTextEx(*help->GetText());
}
反复调用iCutStringHelp->SetTextEx(iCutStringHelp->GetTextEx());运行结果是正确的。

iCutStringSuggest->SetTextEx(_L("\x60A8\x7684\x5EFA\x8BAE"));//实际比这个长
第二次调用iCutStringSuggest->SetTextEx(iCutStringSuggest->GetTextEx());模拟器都退出了

修改为代码(2)就没有问题。

对于代码(2)而言,
不管是 iCutStringHelp->SetTextEx(iCutStringHelp->GetTextEx());
还是 iCutStringSuggest->SetTextEx(iCutStringSuggest->GetTextEx());
delete iText;后内存释放了,即使iText = aText.Alloc();是因为那个地址的内存在,为什么iCutStringHelp的每次都在,而iCutStringSuggest的每次都不在,重启模拟器还是这样的。

难道OS的内存管理方面对Alloc偷懒了?
比如只是让iText的指针指向help->GetText()对应的堆内存区,使用_L()时才是从程序数据段把数据拷贝到iText的指针指向的堆内存,所以前者删除了还可以再分配(对应的堆内存还是由app所有),后者删除了(对应的堆内存OS回收了)就没有了?

[解决办法]
代码太多,下简单点
[解决办法]
1那么写有什么用吗?
[解决办法]
void CutString::SetTextEx( const TDesC & aText )
{

//***********************(1)
HBufC * textOld = iText;
iText = aText.Alloc();
if (NULL != textOld)
{
delete textOld;
textOld = NULL;
}

//***********************(2)
if (NULL != iText)
{
delete iText;
iText = NULL;
}
iText = aText.Alloc( );
}

const TDesC& CutString::GetTextEx() { return *iText; }

[解决办法]

引用:
1那么写有什么用吗?



CutString 是为了将一段字符切割成若干行,如果屏幕的宽度变化了,需要重新切割。

当用户反复晃动屏幕的时候,多次横竖屏幕切换,需要反复计算,反复调用iCutStringHelp->SetTextEx(iCutStringHelp->GetTextEx());


[解决办法]
不好意思,你写的逻辑我还是不明白你为什么要这么写。。不过有一点可以肯定,就是方法2肯定不对。你为什么要这么写呢。你把自己赋值给自己,赋值之前把自己删除了。

[解决办法]
我需要你解释的是为什么

运行代码:
iCutString->SetTextEx(_L("\x60A8\x7684\x5EFA\x8BAE"));
iCutString->SetWidth(240);
iCutString->SetTextEx(iCutStringHelp->GetTextEx());
iCutString->SetWidth(320);
iCutString->SetTextEx(iCutStringHelp->GetTextEx());
出错。

运行代码 :
HBufC *tmp = help->GetText();
iCutString->SetTextEx(*tmp);
iCutString->SetWidth(240);
iCutString->SetTextEx(iCutStringHelp->GetTextEx());
iCutString->SetWidth(320);
iCutString->SetTextEx(iCutStringHelp->GetTextEx());
iCutString->SetWidth(240);
iCutString->SetTextEx(iCutStringHelp->GetTextEx());
iCutString->SetWidth(320);
iCutString->SetTextEx(iCutStringHelp->GetTextEx());
iCutString->SetWidth(240);
iCutString->SetTextEx(iCutStringHelp->GetTextEx());
iCutString->SetWidth(320);
iCutString->SetTextEx(iCutStringHelp->GetTextEx());
... ...
不出错。
[解决办法]
模拟器都退出了?你可以让模拟器发生错误不关闭,而且报错!!看看报什么错误

读书人网 >Symbian

热点推荐