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);
如上代碼才具有線程安全性。
為字符串數據自定義內存分配方案的最簡單的方式是使用 ATL 提供的 CAtlStringMgr 類,但您需要自己提供內存分配例程。CAtlStringMgr 的構造函數采用單一參數:即指向 IAtlMemMgr 對象的指針。IAtlMemMgr 是提供到堆的一般接口的抽象基類。通過 IAtlMemMgr 接口,CAtlStringMgr 分配、重新分配和釋放用于存儲字符串數據的內存。您既可以自已實現 IAtlMemMgr 接口,也可以使用由 ATL 提供的五個內存管理器類之一。ATL 提供的內存管理器只包裝現有的內存分配功能:
要進行字符串內存管理,最有用的類是 CWin32Heap,因為它使您能夠創建多個獨立的堆。例如,如果使用僅用于字符串的獨立堆,可進行以下操作:
//Declare a thread-safe, growable, private heap with initial size 0
CWin32Heap g_stringHeap( 0, 0, 0 );
// Declare a string manager that uses the private heap
CAtlStringMgr g_stringMgr( &g_stringHeap );
要使用此專用的字符串管理器來管理 CString 變量的內存,請將一個指針傳遞給管理器作為 CString 變量的構造函數的一個參數:
void PrintPowers( int nBase )
{
int n = 1;
for( int nPower = 0; nPower < 10; nPower++ )
{
// Use the private string manager, instead of the default
CString strPower( &g_stringMgr );
strPower.Format( "%d", n );
printf( "%s\n", LPCSTR( strPower ) );
n *= nBase;
}
}