当前位置: 代码迷 >> Symbian >> 内存有关问题,哪个老手来解释一上
  详细解决方案

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

热度:8228   发布时间:2013-02-26 00:00:00.0
内存问题,哪个老手来解释一下

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());
  相关解决方案