多线程应用程序中使用CString容易造成内存泄露,那么该怎么办呢?
如果不用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




