CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

多线程应用程序中使用CString容易造成内存泄露,那么该怎么办呢?

楼主Wolfe()2005-11-16 08:54:30 在 VC/MFC / 进程/线程/DLL 提问

如果不用CString,那么CString   CFileDialog::GetPathName之类的要返回CString或参数是CString的函数怎么用呢难道不用吗? 问题点数:60、回复次数:14Top

1 楼Featured(我握着爱情的门票静静排队……)回复于 2005-11-16 09:01:55 得分 5

多线程应用程序中使用CString容易造成内存泄露  
  ========  
  请详细说明原因Top

2 楼Wolfe()回复于 2005-11-16 09:10:29 得分 0

CStringT   类用于操作可变长度的字符串的模板类。保留这些字符串的内存是通过字符串管理器  
  对象来分配和释放的,这与   CStringT   的每个实例相关联。MFC   和   ATL   提供   CStringT   的默认  
  实例,其名称分别为   CString、CStringA   和   CStringW,它们操作不同字符类型的字符串。  
  这些字符类型分别是   TCHAR、char   和   wchar_t   类型。这些默认字符串类型使用字符串管理器,  
  该管理器从进程堆(在   ATL   中)或   CRT   堆(在   MFC   中)分配内存。对于一般的应用程序,  
  该内存分配方案足以应付了。但是,对于大量使用字符串的代码(或多线程代码),默认的内存  
  管理器可能就无法理想地工作。-msdnTop

3 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-11-16 09:15:47 得分 5

只要使用得当不会造成内存泄露Top

4 楼Wolfe()回复于 2005-11-16 09:22:33 得分 0

当然,全局CString不会,临时CString就很容易.Top

5 楼jslisong(碧螺春)回复于 2005-11-16 09:26:47 得分 5

临时CString   也不会吧Top

6 楼danscort2000(danscort.yu)回复于 2005-11-16 22:43:31 得分 10

CString只保证类级的线程安全,  
  要做到对象级别的线程安全,需要你自己进行同步,  
  也就是说,  
  可以同时有N个线程在读,  
  但是写的时候,必须保证没有任何线程"正在"读和写  
  才可以写入.  
  CString   str;  
   
  CCriticalSection   cs;  
  cs->Lock(   );  
  str+="abcdefg";........  
  do   anything   you   want    
  cs->Unlock(   );  
  Top

7 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-11-17 21:11:25 得分 5

需要自己控制好Top

8 楼lianglp(寻找黄金分割点)回复于 2005-11-18 09:09:12 得分 10

呵呵,如下实现,用CString时,是肯定会造成内存泄露:  
  DWORD   __stdcall   ThreadProc(LPVOID   pContext)  
  {  
          CString   strTest   =   "abcd";  
          MessageBox(strTest);  
   
          ......  
   
          ExitThread(0);  
         
          return   NULL;  
  }  
   
  楼主不会是那样的情况吧。Top

9 楼Featured(我握着爱情的门票静静排队……)回复于 2005-11-18 09:56:10 得分 15

看了楼主和楼上兄弟提供的资料,是这样子的。  
   
  按说一般局部变量是分配在stack上的,不会内存泄漏;  
  但是这个Cstring类型的变量就特殊了,“该管理器从进程堆(在   ATL   中)或   CRT   堆(在   MFC   中)分配内存。”既然分配在堆上,那就要回收。默认是到了该变量生存期结束的时候有管理器回收,但是如果你强行         ExitThread(0);   或者exit(0),让该线程“不得好死”,自然就内存泄漏……Top

10 楼wenkui(黒眼看红尘)回复于 2005-11-18 10:12:47 得分 2

说来说去不是cstring的错   楼主错怪人家了Top

11 楼oknight(oknight)回复于 2005-11-19 19:52:12 得分 0

用字符串数组替代吧。  
  在线程里面不会用到CFileDialog之类的东东吧!!!???Top

12 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-11-19 20:42:53 得分 3

CString不是线程安全的。Top

13 楼Wolfe()回复于 2005-11-22 16:18:48 得分 0

抱歉揭帖晚了Top

14 楼zhoujiamurong(有分俺就不要,俺要知识)回复于 2006-05-23 11:56:41 得分 0

markTop

相关问题

  • 多线程应用程序中可否用CString
  • 在Visual Basic.Net中怎么创建多线程应用程序啊
  • ▂ ▃ ▄ ▅ ▆ ▇ █ 暴血管推荐:多线程应用程序的源代码 █ ▇ ▆ ▅ ▄ ▃ ▂
  • 100分的问题(关于多线程数据库应用程序)
  • 我在MFC应用程序中开启了多线程,在新线程中建立远程COM组件~~~
  • 应用程序
  • 请举一个应用程序正常退出,仍然会内存泄露的例子
  • 请教各位.在WEB应用程序中有必要用到多线程吗?在什么情况下需要用到多线程?如果用到的数据库太大(200万记录以上),有什么方法提高性能?是
  • vb.net应用程序!
  • ACCESS应用程序

关键词

  • 内存
  • 多线程
  • 应用程序
  • 线程
  • atl
  • 安全
  • mfc
  • 字符串
  • cstring
  • 管理器

得分解答快速导航

  • 帖主:Wolfe
  • Featured
  • goodboyws
  • jslisong
  • danscort2000
  • oyljerry
  • lianglp
  • Featured
  • wenkui
  • DentistryDoctor

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo