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; }
------解决方案--------------------------------------------------------
CutString 是为了将一段字符切割成若干行,如果屏幕的宽度变化了,需要重新切割。
当用户反复晃动屏幕的时候,多次横竖屏幕切换,需要反复计算,反复调用iCutStringHelp->SetTextEx(iCutStringHelp->GetTextEx());