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

萬星星@豌豆莢 歡迎加入我們
一個(gè)吃軟飯的男人!!!!!我只想寫程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0

昨天做一個(gè)dll,代碼很快寫完了,然而使用得時(shí)候總是遇到string內(nèi)部指針刪除錯(cuò)誤,郁悶了一天,今天沒去公司,好好研究了一下。
首先看下下面這段代碼,聲明兩個(gè)string對(duì)象:

std:: string ??s1? = ? " wlwlxj " ;
std::
string ??s2? = ? " lxjwlwww " ;

調(diào)試狀態(tài)下可以看到內(nèi)部指針:
s1=0x00364ff9
s2=0x00365061
然后執(zhí)行

s2? = ?s1;

按下f11,進(jìn)入xstring源文件:

_Myt & ? operator = ( const ?_Myt & ?_X)?????????// 賦值操作符
??
{ return ?(assign(_X));?}?????????????????????// 調(diào)用assign函數(shù)

繼續(xù)進(jìn)入assign(_X)函數(shù):

_Myt & ?assign( const ?_Myt & ?_X)
????????
{ return ?(assign(_X,? 0 ,?npos));?}???// 調(diào)用assign函數(shù)
繼續(xù)進(jìn)入assign函數(shù),好戲都在這里面:
_Myt&?assign(const?_Myt&?_X,?size_type?_P,?size_type?_M)
????????
{if?(_X.size()?<?_P)
????????????_Xran();
????????size_type?_N?
=?_X.size()?-?_P;
????????
if?(_M?<?_N)
????????????_N?
=?_M;
????????
if?(this?==?&_X)
????????????erase((size_type)(_P?
+?_N)),?erase(0,?_P);
????????
else?if?(0?<?_N?&&?_N?==?_X.size()????????????????????????// 這個(gè)分支意思就是如果拷貝源有內(nèi)容且就是就是源本身,并且
????????????
&&?_Refcnt(_X.c_str())?<?_FROZEN?-?1??????????// 源字符串引用次數(shù)少于255-1次(可見引用次數(shù)最多255次),
????????????
&&?allocator?==?_X.allocator)???????????????????????????//且源字符和目的字符分配器一致
????????????
{_Tidy(true);?????????????????????????????????????????????// 刪除本身
????????????_Ptr?
=?(_E?*)_X.c_str();????????????????????????????????????// 復(fù)制內(nèi)容到目的串
????????????_Len?
=?_X.size();
????????????_Res?
=?_X.capacity();
????????????
++_Refcnt(_Ptr);?}?????????????????????????????????????????????// 增加一次引用

????????
else?if?(_Grow(_N,?true))
????????????
{_Tr::copy(_Ptr,?&_X.c_str()[_P],?_N);
????????????_Eos(_N);?}

????????
return?(*this);?}

這樣結(jié)果就是調(diào)用=號(hào)以后,s2地址和s1地址一樣,都是0x00364ff9。

假如我們動(dòng)態(tài)庫有這樣一個(gè)類class DLL接口:

SetString(std::string?str)
{
m_str?
=?str;
}

在客戶調(diào)用時(shí)候:

std::string?str?=?"wlwlxj";
DLL?d;
d.SetString(str);?
//?此時(shí)沒有深拷貝,而是引用了str內(nèi)部指針地址
在調(diào)用結(jié)束的時(shí)候,dll內(nèi)部刪除成員變量的時(shí)候,會(huì)判斷m_str內(nèi)部指針合法性,由于實(shí)際分配是在調(diào)用端,在dll內(nèi)部自然檢查指針非法。

解決方法就是避免std::string引用計(jì)數(shù),接口處修改為SetString(const char*),這樣在dll內(nèi)部分配內(nèi)存,內(nèi)部釋放,就不會(huì)有問題。
posted on 2006-04-18 16:23 萬連文 閱讀(7129) 評(píng)論(9)  編輯 收藏 引用 所屬分類: 模板

FeedBack:
# re: std::string一個(gè)極其隱晦得問題
2006-04-18 16:55 | cf
此是老問題了,即跨module(exe、dll)間申請(qǐng)/釋放內(nèi)存違例的問題,對(duì)發(fā)生在傳遞c++對(duì)象并使用時(shí),不僅僅發(fā)生在std::string上

原因是由于程序中使用的內(nèi)存管理多來源于crt提供的例程,而非直接使用操作系統(tǒng)的接口,這些例程都需要維護(hù)一些module全局?jǐn)?shù)據(jù)(例如維護(hù)池、維護(hù)空閑塊、或者標(biāo)記已申請(qǐng)的塊等等,不同的實(shí)現(xiàn)中有不同的作用),當(dāng)他們被靜態(tài)連編時(shí),實(shí)際上這些“全局?jǐn)?shù)據(jù)”就不“全局”了,不同的module各自為政,每份module都有自己的“全局?jǐn)?shù)據(jù)”,自身的內(nèi)存信息不為他人所知,module A的合法內(nèi)存快自然不可能通得過module B的合法性驗(yàn)證

解決問題的方法有:
1、不要跨module傳遞c++對(duì)象,或者避免釋放跨module申請(qǐng)的內(nèi)存

2、將參與合作的module統(tǒng)統(tǒng)以multithreaded dll方式鏈入crt庫,讓他們的“全局”數(shù)據(jù)真正全局,注意,所有有交互的module都需要?jiǎng)討B(tài)鏈入crt,

不推薦第二種方式
  回復(fù)  更多評(píng)論
  
# re: std::string一個(gè)極其隱晦得問題
2006-04-18 20:29 | christanxw
Dll的出口函數(shù)最好是用標(biāo)準(zhǔn)的C類型。  回復(fù)  更多評(píng)論
  
# re: std::string一個(gè)極其隱晦得問題
2006-04-18 21:39 | 萬連文
最好是用標(biāo)準(zhǔn)的C類型卻是是一種準(zhǔn)則。
個(gè)人認(rèn)為:作為輸出參數(shù)可以通過指針避免,輸入?yún)?shù)一般沒有問題,上面那個(gè)string僅僅由于實(shí)現(xiàn)上造成的,其實(shí)還可以這樣避免:
SetString(std::string str)
{
m_str = str.c_str();
}
  回復(fù)  更多評(píng)論
  
# re: std::string一個(gè)極其隱晦得問題
2006-04-20 11:52 | cocalele
SetString(std::string str) 雖然避免了問題,但對(duì)象的復(fù)制造成了效率下降。我喜歡

<REF>
2、將參與合作的module統(tǒng)統(tǒng)以multithreaded dll方式鏈入crt庫,讓他們的“全局”數(shù)據(jù)真正全局,注意,所有有交互的module都需要?jiǎng)討B(tài)鏈入crt,
</REF>
而且為了避免這種內(nèi)存問題,我還自己做了一個(gè)內(nèi)存回收的實(shí)現(xiàn),所有模塊只分配內(nèi)存就行了  回復(fù)  更多評(píng)論
  
# re: std::string一個(gè)極其隱晦得問題
2006-04-20 19:53 | Squirrel
那么,使用這樣不是更好?
SetString( const std::string & str ){
m_str = str;
}  回復(fù)  更多評(píng)論
  
# re: std::string一個(gè)極其隱晦得問題
2006-04-20 22:17 | 萬連文
SetString( const std::string & str ){
m_str = str;
}
這樣不可以,因?yàn)檫@樣m_str引用str地址,假如導(dǎo)出類對(duì)象是成員變量m_expOBJ,
有這樣一段代碼:
str = "wlw";
m_expOBJ.SetString(str);
m_expOBJ的m_str引用str指針,作用域過去后str析構(gòu),此時(shí)由于指針被引用,沒有delete內(nèi)存,而m_expOBJ析構(gòu)的時(shí)候,m_str對(duì)象內(nèi)部指針沒有被引用,刪除時(shí)恰好發(fā)現(xiàn)指針不合法,引起問題。
m_str = str.c_str();可以避免引用。   回復(fù)  更多評(píng)論
  
# re: std::string一個(gè)極其隱晦得問題
2006-07-26 15:51 | 愛上小白

有一個(gè)不成文但是卻是重要的前提, STL對(duì)象盡量不要作為dll的接口傳遞.

不過你說的問題應(yīng)該是不存在的, 因?yàn)?
SetString(std::string str)
{
m_str = str; //這里++ref
}

所以結(jié)果str還是存在一個(gè)ref供外部調(diào)用的.
  回復(fù)  更多評(píng)論
  
# re: std::string一個(gè)極其隱晦得問題
2008-06-12 10:45 | 小潘
我這幾天也遇到這個(gè)問題,此問對(duì)我有很多幫助,非常感謝,發(fā)現(xiàn)用STL對(duì)象的確有很多問題,最好改用const char * 如果需要然后在進(jìn)行轉(zhuǎn)換。  回復(fù)  更多評(píng)論
  
# re: std::string一個(gè)極其隱晦得問題
2011-07-30 07:48 | hls
不是stl本身有問題,而是stl的微軟實(shí)現(xiàn)有問題,如果都用stlport就可以解決問題,因?yàn)槲④浥袛嘁粋€(gè)字符串是否沒有分配內(nèi)存不是拿指針是否為NULL來比較,而是把它和一個(gè)全局的“null”字符串來比較,這樣由于跨module后,出現(xiàn)了兩個(gè)“null”字符串,所以導(dǎo)致錯(cuò)誤。微軟的實(shí)現(xiàn)比較的垃圾。  回復(fù)  更多評(píng)論
  
簡(jiǎn)歷下載
聯(lián)系我

<2006年5月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(66)

隨筆分類

隨筆檔案

相冊(cè)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美国产视频在线| 一区二区三区免费网站| 日韩一级免费| 亚洲精品色图| 一区二区久久久久久| 亚洲视频欧美在线| 午夜视频久久久久久| 久久精精品视频| 亚洲天堂激情| 国产一区二区三区视频在线观看 | 午夜精品亚洲| 欧美一区二区三区免费看| 久久久www免费人成黑人精品| 久久激情久久| 亚洲韩国青草视频| 亚洲精品一区二区三区av| 亚洲一区二区三区精品视频| 久久riav二区三区| 欧美久久久久久久久| 国产日产欧美a一级在线| 最新亚洲激情| 久久久久久久性| 日韩视频在线一区二区| 久久精品中文| 国产精品女人网站| 亚洲精选在线| 另类av导航| 一本色道久久综合亚洲精品不| 欧美在线亚洲一区| 国产精品久久久一区二区三区 | 亚洲一区欧美二区| 欧美二区乱c少妇| 亚洲在线播放电影| 欧美精品一区二区视频| 极品av少妇一区二区| 亚洲欧美制服中文字幕| 亚洲精品久久| 欧美国产一区在线| 亚洲福利国产精品| 久久久久青草大香线综合精品| 日韩视频专区| 欧美日本网站| 日韩一区二区免费高清| 女女同性精品视频| 久久xxxx| 国语自产精品视频在线看一大j8| 亚洲欧美春色| 一区二区三区免费网站| 欧美三级电影一区| 欧美—级a级欧美特级ar全黄| 国产丝袜一区二区三区| 午夜精品久久久久久久白皮肤| 亚洲人在线视频| 欧美国产免费| 日韩视频不卡中文| 亚洲精品看片| 欧美视频在线观看一区二区| 一区二区高清视频| 一本色道婷婷久久欧美| 欧美日韩xxxxx| 国产精品99久久99久久久二8| 亚洲国产片色| 欧美日韩亚洲一区三区 | 国产欧美日韩中文字幕在线| 亚洲一区国产一区| 亚洲一区二区黄色| 国产日韩综合| 久久综合九色综合欧美狠狠| 久久精品国产免费观看| 一区免费观看| 亚洲高清在线精品| 欧美片在线观看| 亚洲尤物在线视频观看| 亚洲欧美日韩国产精品| 国产综合色产在线精品| 免费视频久久| 欧美国产日韩一区二区| 亚洲一区尤物| 久久精品亚洲乱码伦伦中文| 亚洲国产婷婷综合在线精品| 日韩一区二区精品在线观看| 国产欧美在线播放| 亚洲国产精品久久久久| 欧美午夜精品久久久| 久久久国产精品一区| 欧美激情中文字幕在线| 欧美在线高清| 欧美日本国产精品| 先锋资源久久| 欧美成人免费视频| 欧美专区日韩专区| 欧美大片在线看| 欧美一区二区播放| 欧美高清在线播放| 久久国产婷婷国产香蕉| 欧美激情亚洲自拍| 久久久久久久久一区二区| 欧美久久久久久久久| 久久频这里精品99香蕉| 欧美色图一区二区三区| 欧美成人黑人xx视频免费观看| 欧美日韩中文在线观看| 欧美mv日韩mv国产网站| 欧美性猛交xxxx乱大交退制版| 久热精品视频| 国产老女人精品毛片久久| 亚洲国产一区二区a毛片| 国产日韩一区| 一本色道久久88综合亚洲精品ⅰ| 亚洲福利国产精品| 欧美一区二区三区四区高清 | 亚洲国产高清aⅴ视频| 国产精品最新自拍| 一区二区三区久久久| 亚洲精品国产精品国自产在线| 欧美一区二区三区四区视频| 亚洲一区二区三区免费在线观看 | 亚洲伦理自拍| 亚洲第一区在线| 亚洲精品一区二区三| 久久精品国产91精品亚洲| 欧美日韩国产精品成人| 欧美好骚综合网| 国产亚洲精品久| 亚洲欧美日韩国产一区二区三区| 99精品国产福利在线观看免费 | 国产精品久久综合| 亚洲人成人99网站| 亚洲精品美女| 欧美激情精品久久久久久黑人| 免费观看在线综合色| 黄色成人在线观看| 久久久久欧美精品| 久久综合伊人77777尤物| 韩日欧美一区二区| 久久久久久久久蜜桃| 美日韩免费视频| 亚洲国产精品久久人人爱蜜臀| 久久一二三四| 亚洲国产另类久久久精品极度| 亚洲成人在线观看视频| 免费不卡视频| 日韩午夜av| 欧美一区二区成人| 精品电影一区| 欧美大片18| 99这里有精品| 久久超碰97人人做人人爱| 国产一区二区在线免费观看| 久久九九全国免费精品观看| 欧美国产精品| 亚洲性夜色噜噜噜7777| 国产精品一区免费视频| 性色av香蕉一区二区| 免费成人高清在线视频| 亚洲欧洲精品一区二区三区| 欧美特黄一区| 久久精品日韩欧美| 欧美二区视频| 亚洲一区二区三区久久| 国产午夜亚洲精品理论片色戒| 久久精品国产77777蜜臀| 欧美韩日亚洲| 亚洲一区二区黄| 狠狠干成人综合网| 欧美日韩国产不卡在线看| 性欧美超级视频| 亚洲激情偷拍| 久久精品视频亚洲| 99国内精品久久| 国产在线视频欧美| 欧美日韩在线看| 久久精品视频在线观看| 亚洲精品之草原avav久久| 久久久久九九视频| 亚洲视频播放| 亚洲福利在线看| 国产女主播一区二区三区| 欧美国产综合| 久久精品天堂| 午夜精品一区二区三区在线视| 亚洲国产成人精品女人久久久| 欧美怡红院视频| 日韩一级在线| 亚洲国产欧美一区二区三区久久 | 欧美不卡视频| 欧美一区二粉嫩精品国产一线天| 亚洲国产美女| 国产亚洲制服色| 欧美日韩综合网| 美女国内精品自产拍在线播放| 亚洲尤物精选| 一区二区日韩免费看| 亚洲国产你懂的| 免费看精品久久片| 久久久久国产精品人| 欧美亚洲综合另类| 亚洲综合三区| 一本久久a久久精品亚洲| 麻豆精品视频在线|