CString 的内存泄露处理

 

VC6‍当用_beginthread建立的线程中使用了cstring,但结束线程时使用_endthread()则会出现内存泄露,如果改成return结束线程,则cstring内存泄露得到解决

---------------以下内容为转载----------------

CString线程安全问题(泄漏)

我以前也遇到过这个问题。后阅读分析了MFC的CString源码后,已经解惑。共大家分享:

在VC++6中,CString 的拷贝构造函数没有使用内存分配,而是使用的引用,它内部保存了一个引用的计数器(这是错误的根源,MFC还有很多BUG那,以后有时间给大家介绍)。

比如:
CString str1="aaa";
CString str2=str1;   //注意,这时候str2并没有调用 new ,而是使用str1的引用同时,str1中保存的引用记数++
str2="abcd1234";     //好了,现在str2才分配内存,str1引用记数--。这同时也是为什么str2.Empty()就没有内存泄露的原因。因为str1的引用记数也--了。

另外,它分配内存的方法是4字节对齐的64字节的倍数+sizeof(内部结构)(超过64的时候)。

在多数情况下,比较简单的使用过程中,MFC的这个BUG不会发作,也就是不会有内存泄露。那什么时候CString会暴露出BUG那?
我以前出现错误的经验是:如果多次调用带有CString引用的参数的函数(形如:funstr(CString &str);这样的函数),在一定的时候(和字符串长度有关系),CString的内部引用记数器发生记数混乱,造成内存泄露。

VC++7(.NET) 中,MFC彻底修改了CString,把它写成了CStringT形式的模板类。它有没有BUG,目前我还不太清楚。

-----------------------

CString在线程处理中,稍有处理不当,极易引起内存泄漏。
让我们来看一个例子:
在线程函数中使用如下代码

CString strstate;    
strstate.Format(
" 正在解密,请稍后... (共 %d 张地图) " ,p -> m_countmap);

可以看到非常简单,在debug下,很容易看到如下的内存泄漏。



怎么回事?
先把修改好的代码放上来
CWin32Heap stringHeap( HEAP_NO_SERIALIZE, 0 , 0 );
CAtlStringMgr stringMgr(
& stringHeap );
CString strstate(
& stringMgr );
strstate.Format(
" 正在解密,请稍后... (共 %d 张地图) " ,p -> m_countmap);
如上代码才具有线程安全性。
 
 
======================================================================
CString m_XUN;

  m_XUN="";

  m_XUN.Empty();//这一句话就可以了,费了我不少痛苦的表情

//晕倒,在debug下运行的程序没有问题,但在release下当退出的时候出现了问题,找来找去还是对CString赋值

的问题,现在正解决中....

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值