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

elva

CString的線程安全問題

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

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

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

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

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

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



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

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

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

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

要進(jìn)行字符串內(nèi)存管理,最有用的類是 CWin32Heap,因?yàn)樗鼓軌騽?chuàng)建多個(gè)獨(dú)立的堆。例如,如果使用僅用于字符串的獨(dú)立堆,可進(jìn)行以下操作:

//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)存,請(qǐng)將一個(gè)指針傳遞給管理器作為 CString 變量的構(gòu)造函數(shù)的一個(gè)參數(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  談新手對(duì)CString的使用
CString類功能強(qiáng)大,比STL的string類有過之無不及.新手使用CString時(shí),都會(huì)被它強(qiáng)大的功能所吸引.然而由于對(duì)它內(nèi)部機(jī)制的不了解,新手在將CString向C的字符數(shù)組轉(zhuǎn)換時(shí)容易出現(xiàn)很多問題.因?yàn)镃String已經(jīng)重載了LPCTSTR運(yùn)算符,所以CString類向const char *轉(zhuǎn)換時(shí)沒有什么麻煩,如下所示:
  char a[100];
  CString str("aaaaaa");
  strncpy(a,(LPCTSTR)str,sizeof(a));
  或者如下:

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

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

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

  2.C表示const

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

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

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

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

  這樣看起來是沒什么問題.我們?cè)賮砜聪旅孢@個(gè)例子:
  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)該沒有改變呀,可是事實(shí)時(shí)他們都變成了"aa".難道str和str1里面的字符指針指向的緩沖區(qū)是一個(gè).我們?cè)贓ffective C++里面得知,如果你的類內(nèi)部有包含指針,請(qǐng)為你的類寫一個(gè)拷貝構(gòu)造函數(shù)和賦值運(yùn)算符.不要讓兩個(gè)對(duì)象內(nèi)部的指針指向同一區(qū)域,而應(yīng)該重新分配內(nèi)存.難道是微軟犯了錯(cuò)?

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

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


posted on 2008-12-22 17:14 葉子 閱讀(4670) 評(píng)論(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>
            亚洲欧美日本伦理| 国产精品一区在线观看你懂的| 亚洲免费视频在线观看| 久久久亚洲影院你懂的| 欧美在线视频在线播放完整版免费观看| 欧美成人视屏| 欧美成年人视频网站| 国产欧美一区二区三区视频| 亚洲精品综合精品自拍| 亚洲日本一区二区| 久久久噜噜噜久久狠狠50岁| 久久精品国产精品亚洲综合| 欧美午夜不卡| 一区二区高清| 中文精品99久久国产香蕉| 免费在线成人av| 欧美aa国产视频| 一区二区三区在线不卡| 欧美一区二区在线播放| 久久国产精品久久国产精品| 国产精品欧美经典| 亚洲视频欧美视频| 香蕉成人啪国产精品视频综合网| 欧美日韩一区二区在线观看视频| 亚洲精品美女91| 亚洲精品美女91| 欧美a级一区二区| 亚洲高清免费视频| 夜夜爽夜夜爽精品视频| 欧美精品一区三区| 亚洲精品三级| 亚洲女人小视频在线观看| 国产精品久久久久9999| 亚洲尤物精选| 久久先锋影音| 亚洲国产综合在线看不卡| 蜜臀99久久精品久久久久久软件| 欧美波霸影院| 99国内精品久久| 国产精品国产精品| 亚洲欧美中文在线视频| 久久人人97超碰国产公开结果 | 国产一区二区三区在线观看网站| 香蕉免费一区二区三区在线观看 | 一区二区三区导航| 欧美一区二区三区视频免费| 国产欧美日韩三区| 久久综合99re88久久爱| 亚洲日本va午夜在线电影| 亚洲永久免费| 国产亚洲午夜高清国产拍精品| 久久久久一区二区三区| 亚洲品质自拍| 欧美诱惑福利视频| 亚洲国产日本| 国产精品黄色在线观看| 久久精品道一区二区三区| 亚洲国内精品| 香蕉国产精品偷在线观看不卡| 一区二区三区在线观看国产| 欧美日韩午夜激情| 久久精品电影| 亚洲天堂av在线免费观看| 美女啪啪无遮挡免费久久网站| 一区二区精品| 尤物99国产成人精品视频| 欧美日韩一区二区免费视频| 香蕉成人伊视频在线观看| 亚洲欧洲一区二区天堂久久 | 亚洲视频免费观看| 国产又爽又黄的激情精品视频| 欧美大尺度在线| 午夜精品久久久久久99热| 亚洲欧洲日韩女同| 久久亚洲一区二区| 亚洲永久精品国产| 亚洲人成网站777色婷婷| 国产亚洲激情在线| 欧美日韩在线播放一区二区| 久热精品视频在线免费观看 | 欧美不卡在线视频| 欧美一级在线播放| 中文在线一区| 亚洲国内在线| 欧美成在线视频| 久久精品最新地址| 性做久久久久久| 一本高清dvd不卡在线观看| 亚洲福利精品| 国内久久精品| 国产日韩欧美一区在线| 欧美色视频日本高清在线观看| 欧美freesex8一10精品| 久久精品一区二区三区不卡牛牛| 亚洲一区二区影院| 亚洲特黄一级片| 一区二区三区 在线观看视频| 亚洲欧洲一区二区三区| 欧美成人中文字幕| 欧美成人高清| 欧美大尺度在线观看| 免费在线亚洲欧美| 久久久九九九九| 久久精品国产精品亚洲| 久久精品99国产精品| 欧美中文字幕第一页| 午夜精品理论片| 亚洲免费一区二区| 亚洲欧美日韩在线不卡| 亚洲欧美经典视频| 性8sex亚洲区入口| 久久久成人网| 男女激情视频一区| 欧美h视频在线| 亚洲电影在线免费观看| 亚洲电影欧美电影有声小说| 欧美黄在线观看| 亚洲国产成人一区| 最新国产の精品合集bt伙计| 亚洲另类在线视频| 日韩午夜av在线| 亚洲综合精品自拍| 久久av一区二区三区| 久久久亚洲欧洲日产国码αv | 国产精品视频专区| 国产热re99久久6国产精品| 国产乱理伦片在线观看夜一区| 国产亚洲精品久| 亚洲国产精品99久久久久久久久| 最近中文字幕日韩精品| 99精品欧美一区二区三区综合在线 | 欧美国产日韩一区| 亚洲欧洲日本国产| 亚洲欧美国产日韩天堂区| 午夜日韩激情| 欧美大片免费观看| 国产精品二区影院| 狠狠色综合播放一区二区| 亚洲日韩中文字幕在线播放| 亚洲亚洲精品三区日韩精品在线视频 | 原创国产精品91| 一本一本久久a久久精品牛牛影视| 亚洲永久免费视频| 浪潮色综合久久天堂| 亚洲人在线视频| 久久爱www久久做| 欧美区在线播放| 国产欧美日韩精品丝袜高跟鞋| 亚洲国产成人久久综合| 亚洲视频一区二区在线观看 | 国产区日韩欧美| 亚洲精品一二区| 久久精品国产免费看久久精品| 亚洲激情二区| 久久精品国产第一区二区三区| 欧美日韩不卡在线| 国产亚洲一区在线| 亚洲一级片在线观看| 欧美成人精品一区二区三区| 一区二区三区视频在线观看| 毛片一区二区| 国产视频在线观看一区二区三区| 一区二区久久久久| 欧美成人福利视频| 欧美一区二区三区在线观看| 欧美日韩国产欧| 亚洲国产成人一区| 久久久97精品| 中文在线一区| 欧美区在线观看| 亚洲人成网站999久久久综合| 久久国产精品一区二区| 一本久久精品一区二区| 老鸭窝亚洲一区二区三区| 国产亚洲精品7777| 午夜精品电影| 夜夜夜久久久| 欧美激情综合网| 有码中文亚洲精品| 久久蜜桃精品| 欧美在线播放视频| 国产精品一区视频| 香蕉久久一区二区不卡无毒影院 | 欧美伊人久久久久久午夜久久久久| 欧美日韩国产成人在线免费| 亚洲欧洲日本专区| 免费成人高清| 久久影院亚洲| 亚洲第一福利社区| 麻豆91精品| 久久久噜噜噜久久人人看| 国产一区二区久久久| 久久久精品一区| 久久国产精品99久久久久久老狼 | 黄色成人片子| 狂野欧美一区| 免费成人黄色av| 亚洲精品一级| 99在线热播精品免费99热| 欧美天堂在线观看|