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

萬星星@豌豆莢 歡迎加入我們
一個(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>
            亚洲激情成人| 欧美中文字幕视频在线观看| 久久久精品动漫| 欧美一区二区三区免费观看视频| 国产热re99久久6国产精品| 欧美一级淫片aaaaaaa视频| 午夜精品一区二区三区在线| 国产美女精品免费电影| 久久蜜桃av一区精品变态类天堂| 久久久欧美一区二区| 亚洲乱码国产乱码精品精| 日韩视频久久| 国内精品久久久久久久影视蜜臀| 欧美1区2区3区| 欧美日韩一视频区二区| 久久av在线看| 欧美激情综合五月色丁香| 亚洲欧美精品一区| 久久久美女艺术照精彩视频福利播放 | 久久综合久久综合久久综合| 女女同性精品视频| 亚洲欧美一区二区激情| 久久久99免费视频| 亚洲视频第一页| 久久久国产成人精品| 一区二区三区视频在线播放| 欧美一区二区三区在| 99一区二区| 久久性天堂网| 午夜亚洲激情| 欧美喷水视频| 老色鬼精品视频在线观看播放 | 亚洲欧美成人在线| 亚洲精品偷拍| 久久精品论坛| 欧美一区二区久久久| 欧美激情一区二区久久久| 久久夜色精品国产亚洲aⅴ| 欧美午夜片欧美片在线观看| 免费试看一区| 红杏aⅴ成人免费视频| 亚洲午夜精品久久| 夜夜嗨av一区二区三区四区 | 99国产成+人+综合+亚洲欧美| 国产自产在线视频一区| 欧美性做爰猛烈叫床潮| 日韩亚洲欧美中文三级| 亚洲一级片在线观看| 夜夜嗨网站十八久久| 免费av成人在线| 久久久久久亚洲精品中文字幕| 国产精品国产三级国产aⅴ无密码| 亚洲国产免费看| 亚洲二区在线视频| 久久久久国产精品www| 久久国产婷婷国产香蕉| 国产精品综合久久久| 一区二区三区欧美在线观看| 亚洲视频一二| 欧美日韩情趣电影| 夜色激情一区二区| 亚洲午夜激情网站| 国产精品99免视看9| 亚洲一二区在线| 欧美一区二区三区视频在线 | 欧美成人tv| 亚洲国产欧美久久| 日韩午夜电影在线观看| 欧美破处大片在线视频| 亚洲精品久久久久中文字幕欢迎你 | 欧美成人精品h版在线观看| 你懂的视频一区二区| 在线日韩av片| 欧美国产一区二区在线观看 | 久久亚洲综合色一区二区三区| 久久三级视频| 91久久精品国产91久久性色| 欧美大片在线观看| 一本在线高清不卡dvd| 亚洲已满18点击进入久久| 国产精品午夜电影| 久久xxxx精品视频| 亚洲第一福利视频| 99天天综合性| 国产三级欧美三级| 玖玖玖国产精品| 亚洲精品日韩精品| 久久精品99无色码中文字幕| 一区在线视频观看| 欧美日韩不卡一区| 午夜亚洲视频| 欧美成人有码| 欧美亚洲三区| 亚洲日韩欧美视频一区| 国产精品日韩欧美| 免播放器亚洲一区| 中日韩高清电影网| 欧美不卡视频一区发布| 亚洲视频在线播放| 狠狠色噜噜狠狠狠狠色吗综合| 欧美极品影院| 久久精品道一区二区三区| 亚洲日韩中文字幕在线播放| 欧美一区二区高清| 亚洲最新中文字幕| 精品不卡一区| 国产精品永久| 欧美日本在线播放| 久久精品免费看| 99伊人成综合| 国产精品v亚洲精品v日韩精品 | 一本色道久久88综合日韩精品| 国产精品久久久久久久久久三级| 久久久久久久激情视频| 亚洲在线网站| 日韩一区二区久久| 欧美高清视频| 久久久免费观看视频| 亚洲嫩草精品久久| 99一区二区| 亚洲日本欧美天堂| 伊人成年综合电影网| 国产拍揄自揄精品视频麻豆| 欧美日韩亚洲一区在线观看| 猛男gaygay欧美视频| 久久国产精品久久久久久| 亚洲午夜激情| 亚洲无吗在线| 一本久道久久久| 亚洲精品影院| 亚洲日本va午夜在线电影| 美女尤物久久精品| 麻豆av一区二区三区久久| 久久精品视频一| 欧美在线免费看| 午夜精品久久久久影视 | 久久久国产视频91| 亚洲欧美在线视频观看| 亚洲一区二区三区视频播放| 一本色道久久综合亚洲精品按摩 | 99综合在线| 中国av一区| 亚洲午夜精品网| 亚洲欧美日韩天堂| 欧美一区永久视频免费观看| 亚洲欧美日韩另类| 久久激情婷婷| 久久亚洲国产成人| 欧美v亚洲v综合ⅴ国产v| 欧美福利视频在线| 欧美激情一二三区| 亚洲人成在线影院| 日韩一区二区精品视频| 一区二区三区鲁丝不卡| 午夜久久一区| 久久精品二区三区| 开元免费观看欧美电视剧网站| 欧美顶级大胆免费视频| 欧美美女bb生活片| 国产精品久久久久久久久免费桃花| 国产精品无码永久免费888| 国产欧美日韩精品丝袜高跟鞋| 国内精品一区二区三区| 亚洲国产精品成人va在线观看| 亚洲免费av片| 亚洲欧美怡红院| 美女视频黄免费的久久| 亚洲三级性片| 亚洲欧美国产三级| 蜜臀久久99精品久久久画质超高清 | 亚洲视频国产视频| 欧美在线一二三| 女同性一区二区三区人了人一 | 一区二区三区波多野结衣在线观看| 久久久久久久999| 亚洲国产精品久久91精品| 亚洲视频第一页| 久久国产主播| 欧美日韩一卡二卡| 国产一区二区久久| 99xxxx成人网| 久久青草欧美一区二区三区| 亚洲精品一区二| 久久国产精品第一页 | 国产精品99久久久久久人 | 亚洲免费观看视频| 久久成人免费| 国产精品你懂的在线欣赏| 亚洲国产精品免费| 欧美在线视频免费播放| 亚洲国产一区在线| 欧美影视一区| 国产精品美女久久久久久2018| 亚洲高清二区| 久久久久久一区二区| 一区二区三区三区在线| 欧美国产在线观看| 亚洲福利视频一区| 久久最新视频| 欧美一区二区视频观看视频|