由CString想到的

因为手头上的一个项目出问题了,调试跟踪的结果是由于CString的处理出现了问题,于是就大致的研究了一下这个会经常用到的类。

Cstring出现的原因,是由于在大量实践中发现出现错误最多的是字串的操作出问题,例如溢出、泄露等;MFC中的CString类解决了上面的问题;

CString的头文件是AFX.H文件,而实现文件则分成了几个,大致包括STREX.cpp,STRCORE.cpp和AFX.inl;

关于CString的一些说明,可以参考http://blog.csdn.net/shupan001/article/details/6437783,感觉这一片文写的还不错!


感觉如果要真正的理解CString,可以抓住以下几点: 1)了解CStringData类的作用  2)了解CString对CStringData的操作 3)了解引用计数 4)了解写入复制技术(copybeforewrite)


详细说明一下我遇到的问题吧,在这个项目里需要将一个传递进来的字串格式化出来,然后分析里面的一些参数值,例如

DISPLAY MODE=1 & SPEED=2& SCROLLSTOPTIME=1&COLOR=1&SHOWSTOPTIME=1

我的目的是将各个字串分离出来,然后读到配置的数值,使用了如下的方法:

1)首先调用如下函数,将输入的字符串str历史split进行分割,分割后将内容通过函数返回值进行返回,参数中的iSubStrs是分割出的字串个数

CString * SplitString(CString& str, char split, int& iSubStrs)

调用方法: pStr = SplitString(str,'&',nSubStringCount);

2)将分割出的内容逐个进行分析,然后针对每一种情况取等号后面的值

调用时采用如下方法:

pTEmp = SplitString(str,'=',nTemp);

其中pTEmp是一个CString的指针,Str为CString

3)使用完成后,需要释放CString指针指向的相关空间,采用如下的方法

//释放字符数组
bool FreeStrings(CString* pStr,int& iSubStrs)
{
if( iSubStrs == 0)
return true;


{
// shrink to nothing
DestructElements(pStr, iSubStrs);
delete[] (BYTE*)pStr;
pStr = NULL;
}
return true;
}


其中的DestructElements是MFC内部的一个函数,用来释放由CString*指针指向的内存空间!

其实最感兴趣的应该是为CString*指针申请和释放空间的步骤,例如 delete[] (BYTE*)pstr; 为释放,pstr = (CString*) new BYTE[nSize];为申请空间。


根据我自己的测试而言,当使用上面的方式进行操作时,如果频繁的执行这个过程,会导致内存泄露,目前这个原因还没找到,初步怀疑还是在使用堆分配空间在删除的时候不知道什么地方没有释放;

而后又使用了CStringArray方法来进行操作,使用此种方法之后不再出内存泄露的问题了,而且使用此方法还有一个好处,因为是在栈上申请的CStringArray对象,因此就不担心内存泄露的问题了!

void SplitString(CString str, char split, CStringArray &strArry)//此为分割的函数
{
CString strGet(_T(""));
int i = 0;


while (AfxExtractSubString(strGet, str, i++, _T(split)))
{
strArry.Add(strGet);

SevErrWritelog(LOG_TYPE_OTHER_LOG,"%s",strGet); //这是一个写日志的动作
strGet.Empty();
}

SevErrWritelog(LOG_TYPE_OTHER_LOG,"分割符个数=%d",i-1); //这是一个写日志的动作
}




最后再说一个题外话,关于代码格式的问题!当查看MFC的代码时,发现一条如下的代码,看的第一眼我傻了,没见过这种格式的代码,后来阅读了函数说明后才晓得了意思,真是难为死了写代码的人了啊...

int nSrcLen = lpsz != NULL ? lstrlen(lpsz) : 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值