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中使用的方案。