内存问题,哪个老手来解释一下
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; }
[解决办法]
[解决办法]
不好意思,你写的逻辑我还是不明白你为什么要这么写。。不过有一点可以肯定,就是方法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());
... ...
不出错。
[解决办法]
模拟器都退出了?你可以让模拟器发生错误不关闭,而且报错!!看看报什么错误