青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

elva

CString的線程安全問題

在多線程中使用一個局部CString變量相加時發(fā)現(xiàn)相加的結(jié)果是后一個字符串值,沒有時間過多研究,只好改成了char*,不過如下方法也可以避免:
CWin32Heap stringHeap( HEAP_NO_SERIALIZE, 00 );
CAtlStringMgr stringMgr( 
&stringHeap );
CString strstate(
&stringMgr );

找了一些資料貼上來希望對過客有用:
http://m.shnenglu.com/alantop/archive/2008/07/10/55786.html

討論CString線程安全性問題(內(nèi)存泄漏)

CString在線程處理中,稍有處理不當(dāng),極易引起內(nèi)存泄漏。
讓我們來看一個例子:
在線程函數(shù)中使用如下代碼

CString strstate;    
strstate.Format(
"正在解密,請稍后... (共 %d 張地圖)",p->m_countmap);

可以看到非常簡單,在debug下,很容易看到如下的內(nèi)存泄漏。



怎么回事?
先把修改好的代碼放上來
CWin32Heap stringHeap( HEAP_NO_SERIALIZE, 00 );
CAtlStringMgr stringMgr( 
&stringHeap );
CString strstate(
&stringMgr );
strstate.Format(
"正在解密,請稍后... (共 %d 張地圖)",p->m_countmap);
如上代碼才具有線程安全性。

http://msdn.microsoft.com/zh-cn/library/cc485480(VS.71).aspx

Visual C++ 概念:添加功能
自定義字符串管理器的實現(xiàn)(基本方法)

為字符串?dāng)?shù)據(jù)自定義內(nèi)存分配方案的最簡單的方式是使用 ATL 提供的 CAtlStringMgr 類,但您需要自己提供內(nèi)存分配例程。CAtlStringMgr 的構(gòu)造函數(shù)采用單一參數(shù):即指向 IAtlMemMgr 對象的指針。IAtlMemMgr 是提供到堆的一般接口的抽象基類。通過 IAtlMemMgr 接口,CAtlStringMgr 分配、重新分配和釋放用于存儲字符串?dāng)?shù)據(jù)的內(nèi)存。您既可以自已實現(xiàn) IAtlMemMgr 接口,也可以使用由 ATL 提供的五個內(nèi)存管理器類之一。ATL 提供的內(nèi)存管理器只包裝現(xiàn)有的內(nèi)存分配功能:

要進行字符串內(nèi)存管理,最有用的類是 CWin32Heap,因為它使您能夠創(chuàng)建多個獨立的堆。例如,如果使用僅用于字符串的獨立堆,可進行以下操作:

//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 變量的內(nèi)存,請將一個指針傳遞給管理器作為 CString 變量的構(gòu)造函數(shù)的一個參數(shù):

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;
}
}

http://blog.csdn.net/zero_dian/archive/2006/01/08/573352.aspx  談新手對CString的使用
CString類功能強大,比STL的string類有過之無不及.新手使用CString時,都會被它強大的功能所吸引.然而由于對它內(nèi)部機制的不了解,新手在將CString向C的字符數(shù)組轉(zhuǎn)換時容易出現(xiàn)很多問題.因為CString已經(jīng)重載了LPCTSTR運算符,所以CString類向const char *轉(zhuǎn)換時沒有什么麻煩,如下所示:
  char a[100];
  CString str("aaaaaa");
  strncpy(a,(LPCTSTR)str,sizeof(a));
  或者如下:

  strncpy(a,str,sizeof(a));

  以上兩種用法都是正確地.因為strncpy的第二個參數(shù)類型為const char *.所以編譯器會自動將CString類轉(zhuǎn)換成const char *.很多人對LPCTSTR是什么東西迷惑不解,讓我們來看看:

  1.LP表示長指針,在win16下有長指針(LP)和短指針(P)的區(qū)別,而在win32下是沒有區(qū)別的,都是32位.所以這里的LP和P是等價的.

  2.C表示const

  3.T是什么東西呢,我們知道TCHAR在采用UNICODE方式編譯時是wchar_t,在普通時編譯成char那么就可以看出LPCTSTR(PCTSTR)在UINCODE時是const wchar_t *,PCWSTR,LPCWSTR,在多字節(jié)字符模式時是const char *, PCSTR,LPCSTR.接下來我們看在非UNICODE情況下,怎樣將CString轉(zhuǎn)換成char *,很多初學(xué)者都為了方便采用如下方法:
  (char *)(LPCSTR)str

  這樣對嗎?我們首先來看一個例子:
  CString str("aa");
  strcpy((char *)(LPCTSTR)str,"aaaaaaaa");
  cout<<(LPCTSTR)str<<endl;

  在Debug下運行出現(xiàn)了異常,我們都知道CString類內(nèi)部有自己的字符指針,指向一個已分配的字符緩沖區(qū).如果往里面寫的字符數(shù)超出了緩沖區(qū)范圍,當(dāng)然會出現(xiàn)異常.但這個程序在Release版本下不會出現(xiàn)問題.原來對CString類已經(jīng)進行了優(yōu)化.當(dāng)需要分配的內(nèi)存小于64字節(jié)時,直接分配64字節(jié)的內(nèi)存,以此類推,一般CString類字符緩沖區(qū)的大小為64,128,256,512...這樣是為了減少內(nèi)存分配的次數(shù),提高速度.

  那有人就說我往里面寫的字符數(shù)不超過它原來的字符數(shù),不就不會出錯了,比如
  CString str("aaaaaaa");
  strcpy((char *)(LPCTSTR)str,"aa");
  cout<<(LPCTSTR)str<<endl;

  這樣看起來是沒什么問題.我們再來看下面這個例子:
  CString str("aaaaaaa");
  strcpy((char *)(LPCTSTR)str,"aa");
  cout<<(LPCTSTR)str<<endl;
  cout<<str.GetLength()<<endl;

  我們看到str的長度沒有隨之改變,繼續(xù)為7而不是2.還有更嚴(yán)重的問題:
  CString str("aaaaaaa");
  CString str1 = str;
  strcpy((char *)(LPCTSTR)str,"aa");
  cout<<(LPCTSTR)str<<endl;
  cout<<(LPCTSTR)str1<<endl;

  按說我們只改變了str,str1應(yīng)該沒有改變呀,可是事實時他們都變成了"aa".難道str和str1里面的字符指針指向的緩沖區(qū)是一個.我們在Effective C++里面得知,如果你的類內(nèi)部有包含指針,請為你的類寫一個拷貝構(gòu)造函數(shù)和賦值運算符.不要讓兩個對象內(nèi)部的指針指向同一區(qū)域,而應(yīng)該重新分配內(nèi)存.難道是微軟犯了錯?

  原來這里還有一個"寫時復(fù)制"和"引用計數(shù)"的概念.CString類的用途很廣,這樣有可能在系統(tǒng)內(nèi)部產(chǎn)生大量的CString臨時對象.這時為了優(yōu)化效率,就采用在系統(tǒng)軟件內(nèi)部廣泛使用的"寫時復(fù)制"概念.即當(dāng)從一個CString產(chǎn)生另一個CString并不復(fù)制它的字符緩沖區(qū)內(nèi)容,而只是將字符緩沖區(qū)的"引用計數(shù)"加1.當(dāng)需要改寫字符緩沖區(qū)內(nèi)的內(nèi)容時,才分配內(nèi)存,并復(fù)制內(nèi)容.以后我會給出一個"寫時復(fù)制"和"引用計數(shù)"的例子我們回到主題上來,當(dāng)我們需要將CString轉(zhuǎn)換成char *時,我們應(yīng)該怎么做呢?其時只是麻煩一點,如下所示:
  CString str("aaaaaaa");
  strcpy(str.GetBuffer(10),"aa");
  str.ReleaseBuffer();

  當(dāng)我們需要字符數(shù)組時調(diào)用GetBuffer(int n),其中n為我們需要的字符數(shù)組的長度.使用完成后一定要馬上調(diào)用ReleaseBuffer();還有很重要的一點就是,在能使用const char *的地方,就不要使用char *


posted on 2008-12-22 17:14 葉子 閱讀(4657) 評論(0)  編輯 收藏 引用 所屬分類: C\C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人一区二区三区在线观看| 一区二区三区导航| 欧美日韩在线不卡一区| 久久日韩粉嫩一区二区三区| 久久久精品午夜少妇| 欧美一区二区日韩一区二区| 香蕉久久一区二区不卡无毒影院| 99视频超级精品| 亚洲欧美激情诱惑| 久久久久久日产精品| 欧美精品自拍| 国产一区二区三区丝袜| 亚洲成色最大综合在线| 夜夜嗨av一区二区三区中文字幕| 亚洲在线免费| 欧美激情一区二区三区在线视频 | 亚洲男人的天堂在线观看| 一区二区三区欧美| 久久一区中文字幕| 中文精品视频| 欧美破处大片在线视频| 尤物yw午夜国产精品视频| 亚洲欧美日韩精品| 亚洲精品国产日韩| 亚洲精品日韩在线| 欧美国产91| 日韩亚洲成人av在线| 模特精品在线| 一区二区三区四区五区在线| 久久亚洲精品一区二区| 国产一区二区三区最好精华液| 先锋影音网一区二区| 亚洲欧美日韩在线不卡| 欧美成人午夜剧场免费观看| 午夜在线视频观看日韩17c| 欧美午夜精品理论片a级按摩 | 欧美一区二区黄色| 国产精品99久久久久久宅男| 欧美日韩裸体免费视频| 日韩视频中文| 亚洲色图制服丝袜| 国产精品亚洲视频| 欧美成人中文字幕| 欧美视频中文字幕在线| 欧美日韩视频在线一区二区观看视频| 国产午夜精品一区理论片飘花| 亚洲电影中文字幕| 亚洲精品欧洲精品| 国产色婷婷国产综合在线理论片a| 午夜亚洲激情| 另类春色校园亚洲| 亚洲影视在线| 欧美不卡在线| 久久精品国产久精国产思思| 久久综合网络一区二区| 亚洲性人人天天夜夜摸| 久久国产精品一区二区三区四区 | 欧美视频二区36p| 久久久人成影片一区二区三区| 欧美r片在线| 久久美女艺术照精彩视频福利播放| 裸体女人亚洲精品一区| 西西人体一区二区| 嫩草伊人久久精品少妇av杨幂| 亚洲图片在线观看| 久久午夜精品| 久久精品国产久精国产爱| 欧美日韩中字| 99在线热播精品免费| 亚洲精品乱码视频| 免费在线成人| 一区二区国产日产| 亚洲国产精品一区| 亚洲精品偷拍| 欧美日本在线看| 欧美aⅴ一区二区三区视频| 国产精品一区二区在线观看| 亚洲精品在线观看视频| 99riav国产精品| 亚洲愉拍自拍另类高清精品| 免费高清在线视频一区·| 久久av在线看| 欧美日韩国产综合视频在线观看| 欧美国产精品久久| 欧美与欧洲交xxxx免费观看| 国产一区91精品张津瑜| 午夜精品www| 亚洲电影av| 午夜精品影院在线观看| 国产一区二区三区久久悠悠色av | 女仆av观看一区| 亚洲美女黄色| 国内精品久久久久国产盗摄免费观看完整版| 亚洲先锋成人| 国产又爽又黄的激情精品视频 | 国产在线日韩| 国内久久婷婷综合| 午夜精品久久久久久久| 国产日韩精品视频一区| 欧美粗暴jizz性欧美20| 亚洲欧美日韩国产精品| 亚洲精品在线视频| 欧美成人精品1314www| 久久一区二区三区av| 欧美在线观看一区| 午夜亚洲精品| 久久久久久综合| 欧美一二三区在线观看| 亚洲最新色图| 亚洲一区亚洲| 小嫩嫩精品导航| 亚洲欧美日韩精品综合在线观看| 亚洲日本免费电影| 亚洲少妇最新在线视频| 国产午夜精品理论片a级探花| 欧美日韩亚洲一区二区三区在线观看| 欧美在线观看天堂一区二区三区| 国产精品极品美女粉嫩高清在线| 欧美专区亚洲专区| 国外精品视频| 国产午夜精品久久| 伊人成年综合电影网| 国语自产在线不卡| 亚洲最新在线视频| 亚洲一区欧美激情| 久久久久久一区二区| 欧美a级片一区| 亚洲国产高清aⅴ视频| 99re热这里只有精品免费视频| 9人人澡人人爽人人精品| 亚洲久色影视| 欧美日韩国产小视频在线观看| 国产欧美一区二区三区久久| 亚洲性线免费观看视频成熟| 一区二区精品国产| 国产精品男gay被猛男狂揉视频| 亚洲免费成人av电影| 欧美福利小视频| 欧美激情片在线观看| 亚洲婷婷综合色高清在线 | 亚洲伊人网站| 亚洲国产小视频在线观看| 中文精品视频| 欧美系列一区| 亚洲影音一区| 欧美一级片在线播放| 国产日韩亚洲欧美精品| 中文在线不卡| 久久一区二区三区国产精品| 国产亚洲一级| 欧美在线观看你懂的| 亚洲欧美日韩视频二区| 久久久久久69| 午夜视频在线观看一区| 免费在线一区二区| 午夜精品一区二区三区在线视| 欧美三级视频| 久久精品欧美日韩| 久久综合网络一区二区| 亚洲作爱视频| 亚洲无人区一区| 国产精品亚洲成人| 欧美日韩一区二区高清| 亚洲国产日韩美| 日韩视频免费观看高清完整版| 欧美激情第4页| 午夜精品久久久久久久男人的天堂| 亚洲午夜精品国产| 国产欧美亚洲一区| 亚洲电影激情视频网站| 欧美—级a级欧美特级ar全黄| 亚洲欧美变态国产另类| 日韩视频一区二区在线观看 | 伊人久久大香线蕉av超碰演员| 久久三级视频| 国产精品毛片a∨一区二区三区|国| 久久国产精品网站| 欧美日本亚洲视频| 久久综合久久久久88| 久久精品视频免费| 亚洲午夜精品一区二区三区他趣| 久久久久综合一区二区三区| 中文日韩电影网站| 久久综合九色九九| 另类春色校园亚洲| 国产欧美一区二区三区在线老狼| 99精品国产99久久久久久福利| 亚洲黄色三级| 欧美成人xxx| 亚洲高清在线观看一区| 先锋影音网一区二区| 性久久久久久久久久久久| 欧美日韩视频一区二区三区| 91久久极品少妇xxxxⅹ软件| 在线免费观看日本一区| 久久精品亚洲一区| 亚洲综合大片69999| 国产精品一区久久| 久久国产精彩视频| 亚洲第一区在线|