(一)关于线程安全问题的想法:CString

CString实现的机制.

   CString是通过“引用”来管理串的,“引用”这个词我相信大家并不陌生,象Window内核对象、COM对象等都是通过引用来实现的。而CString也是通过这样的机制来管理分配的内存块。实际上CString对象只有一个指针成员变量,所以任何CString实例的长度只有4字节.

 

首先来个例子:

void threadProc (void * param)
{
CString str,showText;
str.Format("we get it,are you ok?");
for(int i=0;i<100;i++)
showText +=str;
}

int main()
{
for(int i=0;i<100;i++)
_beginthread(threadProc,0,NULL);

Sleep(10000);
}
debug调试结束,就会出现memory leaks!当然如果在大程序中运行,内存消耗一定程度,程序也会崩溃!


这个和线程同步无关,和CString内存管理机制有关!

建议线程中使用以下设置后,在进行操作。

CWin32Heap stringHeap( HEAP_NO_SERIALIZE, 0, 0 );
CAtlStringMgr stringMgr( &stringHeap );
CString strstate(&stringMgr );
要进行字符串内存管理,最有用的类是 CWin32Heap,因为它使您能够创建多个独立的堆。
字符串数据自定义内存分配方案的最简单的方式是使用 ATL 提供的 CAtlStringMgr 类,但您需要自己提供内存分配例程。

通过以上设置后,线程关于CString strstate就可以安全使用了。

 

另外,这里问题出来了,前面两个类是在VS2005之后开始支持的,目前没有找到在VC6中使用的方案。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值