欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

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

更新时间: 2014-01-05 02:40:22 责任编辑: Author_N1

 

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

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());
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:40:22
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/12938/
本文WWW.DOC100.NET DOC100.NET版权所有。