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

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

昨天做一個(gè)dll,代碼很快寫(xiě)完了,然而使用得時(shí)候總是遇到string內(nèi)部指針刪除錯(cuò)誤,郁悶了一天,今天沒(méi)去公司,好好研究了一下。
首先看下下面這段代碼,聲明兩個(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次(可見(jiàn)引用次數(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)庫(kù)有這樣一個(gè)類(lèi)class DLL接口:

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

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

std::string?str?=?"wlwlxj";
DLL?d;
d.SetString(str);?
//?此時(shí)沒(méi)有深拷貝,而是引用了str內(nèi)部指針地址
在調(diào)用結(jié)束的時(shí)候,dll內(nèi)部刪除成員變量的時(shí)候,會(huì)判斷m_str內(nèi)部指針合法性,由于實(shí)際分配是在調(diào)用端,在dll內(nèi)部自然檢查指針?lè)欠ā?br />
解決方法就是避免std::string引用計(jì)數(shù),接口處修改為SetString(const char*),這樣在dll內(nèi)部分配內(nèi)存,內(nèi)部釋放,就不會(huì)有問(wèn)題。
posted on 2006-04-18 16:23 萬(wàn)連文 閱讀(7144) 評(píng)論(9)  編輯 收藏 引用 所屬分類(lèi): 模板

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

原因是由于程序中使用的內(nèi)存管理多來(lá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)存快自然不可能通得過(guò)module B的合法性驗(yàn)證

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

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

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

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

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

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

<2006年4月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(66)

隨筆分類(lèi)

隨筆檔案

相冊(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>
            欧美一区二区三区免费视频| 免费视频亚洲| 欧美精品乱码久久久久久按摩 | 尤物在线精品| 久久久久一区二区| 亚洲电影欧美电影有声小说| 激情视频一区二区三区| 久久久久久一区二区三区| 欧美成年人视频网站| 亚洲看片一区| 欧美日韩日韩| 午夜日韩在线观看| 葵司免费一区二区三区四区五区| 亚洲经典一区| 国产亚洲福利一区| 亚洲欧美日韩国产中文在线| 久久激情一区| 亚洲国产合集| 欧美三级电影网| 午夜精品区一区二区三| 久久婷婷人人澡人人喊人人爽 | 久久久久99精品国产片| 伊人蜜桃色噜噜激情综合| 欧美激情在线免费观看| 亚洲欧美成人网| 欧美**人妖| 一区二区三区产品免费精品久久75| 国产精品中文在线| 欧美va天堂在线| 亚洲欧美日韩在线播放| 亚洲国产精品www| 亚洲一区二区精品| 亚洲高清久久久| 欧美午夜女人视频在线| 久久久久久久综合色一本| 日韩午夜免费| 免费成人在线观看视频| 亚洲午夜精品久久| 精品不卡一区二区三区| 国产精品美女久久| 欧美好吊妞视频| 亚洲欧美国产精品桃花| 亚洲激情小视频| 可以免费看不卡的av网站| 亚洲色图自拍| 亚洲国产精品日韩| 国产一区二区中文| 国产精品www| 激情欧美一区| 亚欧成人在线| 一本色道久久综合亚洲二区三区 | 亚洲色图在线视频| 亚洲第一黄色| 久久久久久亚洲综合影院红桃| 99精品久久免费看蜜臀剧情介绍| 国产一级一区二区| 国产精品久久久久久久7电影| 久久蜜桃精品| 久久精品九九| 欧美在线一二三四区| 亚洲一区二区高清| 亚洲乱码精品一二三四区日韩在线| 麻豆国产精品一区二区三区| 久久国产视频网| 欧美一级专区免费大片| 亚洲一线二线三线久久久| 99热在这里有精品免费| 亚洲精品免费一二三区| 亚洲国产精品123| 精品动漫一区| 精品69视频一区二区三区| 国产精品视频xxxx| 国产精品h在线观看| 欧美日韩一级黄| 欧美成人资源| 欧美日韩mv| 欧美午夜女人视频在线| 欧美吻胸吃奶大尺度电影| 欧美日韩综合精品| 欧美午夜精品久久久久久浪潮| 欧美日韩你懂的| 欧美视频导航| 国产精品视频福利| 国产亚洲精品久久久| 国产一区视频网站| 亚洲视频福利| 中文有码久久| 亚洲欧美精品在线| 欧美在线观看天堂一区二区三区| 欧美在线在线| 欧美www在线| 91久久精品国产91性色| 亚洲国产经典视频| 艳女tv在线观看国产一区| 在线一区二区三区四区五区| 一本大道久久精品懂色aⅴ | 亚洲激情视频| 99爱精品视频| 亚洲免费视频观看| 久久精品国产欧美激情 | 欧美福利一区二区| 欧美日韩综合视频| 国产日韩欧美| 亚洲电影第1页| 一本久道久久综合狠狠爱| 亚洲欧美日韩在线| 久久久久久夜精品精品免费| 久久人体大胆视频| 亚洲精品乱码久久久久久| 中国成人黄色视屏| 久久久久国产精品一区二区| 欧美大片91| 欧美天堂在线观看| 国外成人在线视频网站| 99在线精品视频| 久久久精品动漫| 欧美xart系列高清| 亚洲一级免费视频| 男人插女人欧美| 国产乱肥老妇国产一区二| 亚洲国产欧美日韩另类综合| 一本色道精品久久一区二区三区 | 亚洲欧美精品一区| 欧美日韩一区在线观看视频| 久久国产日本精品| 欧美日韩一区二区高清| 悠悠资源网亚洲青| 亚洲一区二区三区777| 久久伊人一区二区| 99这里只有精品| 久久中文在线| 国产一区二区三区四区在线观看| 一区二区欧美精品| 免费日韩av| 中文一区二区在线观看| 欧美a级片网| 国产亚洲精品aa午夜观看| 亚洲成人在线网| 久久福利一区| 日韩亚洲欧美成人| 欧美不卡在线| 影音先锋亚洲一区| 欧美一级在线视频| 一本大道久久a久久精品综合| 久久亚洲高清| 国产视频欧美| 亚洲综合日韩在线| 亚洲免费av电影| 欧美xxx成人| …久久精品99久久香蕉国产| 久久久久久一区| 午夜精品婷婷| 国产日韩欧美一区二区三区在线观看| 亚洲一区二区三区涩| 亚洲人成网站色ww在线| 久久综合亚洲社区| 在线免费高清一区二区三区| 久久免费少妇高潮久久精品99| 亚洲在线观看视频网站| 国产精品国码视频| 亚洲一区二区影院| 一本色道久久综合狠狠躁篇怎么玩| 欧美久久久久久久| 99riav久久精品riav| 亚洲风情在线资源站| 亚洲综合另类| 国产日韩欧美视频在线| 欧美在线观看视频一区二区三区| 亚洲午夜在线观看视频在线| 国产精品午夜电影| 亚洲欧美日本精品| 亚洲在线观看视频网站| 国产欧美亚洲精品| 久久精品最新地址| 久久精品欧美| 亚洲国产一区二区精品专区| 欧美成人精品在线播放| 理论片一区二区在线| 亚洲国产一区二区三区a毛片| 欧美国产高清| 欧美激情亚洲综合一区| 亚洲性线免费观看视频成熟| 999在线观看精品免费不卡网站| 欧美成人网在线| 亚洲视频在线观看三级| 亚洲在线观看视频网站| 一区二区三区在线看| 欧美成人免费全部| 欧美日韩国产精品成人| 午夜欧美理论片| 久久精品国产久精国产一老狼| 狠狠色狠狠色综合系列| 欧美高清一区| 欧美色精品在线视频| 欧美一区二区三区在线| 亚洲欧美影院| 激情一区二区| 日韩视频免费大全中文字幕| 国产精品少妇自拍| 亚洲第一视频|