C++编程CString 占用内存被多次Release出错

浏览:36日期:2023-05-06

问题描述

编写了一段代码,作用是将部分信号显示在界面上,出错部分如下:

double aaa[1024]={0};int rtn=m_pClientSocket->GetDatas(aaa);CString str;for (int i=0;i<rtn;i++){ CString tmp; tmp.Format('%5.0f ',aaa[i]); if ((i+1)%100 == 0)tmp+='rn'; str+=tmp;}m_pMessagesView->m_responseData.SetWindowText(str);

char Ascii[200]={0};char Command[1024]={0};int CommandLength=m_pClientSocket->GetBytes(Command);int j=0;int k=0;for(int i=0;i<CommandLength;i++){ k=(Command[i]>>4)&0x0f; k=k+0x30; if(k>0x39) k=k+7; Ascii[j]=k; j++; k=Command[i]&0x0F; k=k+0x30; if(k>0x39) k=k+7; Ascii[j]=k; j++; Ascii[j]=0x20; j++;};

上述代码声明了一个CString str,处理完显示部分m_pMessagesView->m_responseData.SetWindowText(str)之后,并未再调用str的地方,正常的思路是在这段代码执行完后析构该CString。但是在进入最后一段循环时for(int i=0;i<CommandLength;i++)执行若干步骤后,str变为错误的指针,其内存已被释放,程序最终在析构CString时出错void Release() throw()

{ ATLASSERT( nRefs != 0 );//此处出错 if( _AtlInterlockedDecrement( &nRefs ) <= 0 ) {pStringMgr->Free( this ); }}

不知这段循环是如何析构CString的呢?

问题解答

回答1:

如果你的代码是两块不相干的作用域应该不会有什么问题,出错了那大半可能是你的内存写越界了。。检查一下CommandLength的长度是否会大于你声明的固定长度,如果没有什么发现的话可以单步调试,监视str的值变化

相关文章: