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

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

昨天做一個(gè)dll,代碼很快寫完了,然而使用得時(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è)類class DLL接口:

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

在客戶調(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)連文 閱讀(7138) 評(píng)論(9)  編輯 收藏 引用 所屬分類: 模板

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類型。  回復(fù)  更多評(píng)論
  
# re: std::string一個(gè)極其隱晦得問(wèn)題
2006-04-18 21:39 | 萬(wàn)連文
最好是用標(biāo)準(zhǔn)的C類型卻是是一種準(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)出類對(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)系我

<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(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>
            亚洲精品在线视频| 欧美bbbxxxxx| 麻豆成人在线观看| 老司机午夜精品视频在线观看| 亚洲视频中文字幕| 午夜精品亚洲一区二区三区嫩草| 亚洲在线一区| 欧美在线国产| 久久久在线视频| 免费在线欧美视频| 亚洲国产高清一区二区三区| 欧美成人综合| 亚洲狼人综合| 午夜视频一区| 欧美激情日韩| 国产日韩av一区二区| 亚洲国产女人aaa毛片在线| 一本到高清视频免费精品| 亚洲中字黄色| 欧美bbbxxxxx| 亚洲欧美另类在线| 鲁大师影院一区二区三区| 欧美日韩视频一区二区三区| 国产精品久久999| 激情久久婷婷| 亚洲一区二区三区在线看| 久久精彩免费视频| 最新国产拍偷乱拍精品| 亚洲小视频在线| 欧美精选在线| 影音先锋日韩有码| 一本色道久久综合狠狠躁篇的优点| 翔田千里一区二区| 亚洲另类一区二区| 欧美性做爰毛片| 欧美在线www| 欧美大片91| 蜜桃av一区二区三区| 久久激情五月丁香伊人| 久久久亚洲综合| 欧美成人精品h版在线观看| 欧美日韩一区二区三区四区五区| 欧美激情一级片一区二区| 国产精品日韩欧美综合| 亚洲日韩中文字幕在线播放| 亚洲欧美日韩精品久久久| 另类图片综合电影| 亚洲综合日韩| 国产麻豆成人精品| 日韩视频中文| 你懂的视频一区二区| 亚洲欧美一区二区激情| 欧美99在线视频观看| 曰韩精品一区二区| 久久国产黑丝| 中文精品视频| 国产精品狠色婷| 亚洲欧美bt| 一区二区激情视频| 欧美精品18+| 亚洲一区二区日本| 亚洲国产欧美国产综合一区| 久久精品一区二区三区中文字幕| 欧美日韩国产在线播放| 亚洲网站啪啪| 亚洲视频一起| 国内精品美女在线观看| 亚洲欧美日本视频在线观看| 欧美激情亚洲国产| 亚洲欧美日本精品| 久久一区二区三区四区| 亚洲黄一区二区三区| 91久久精品国产91久久| 欧美日韩综合网| 另类天堂视频在线观看| 免费成人av在线| 性欧美暴力猛交另类hd| 久久综合久色欧美综合狠狠| 一区二区三区日韩精品| 欧美在线视频免费播放| 亚洲视频一区| 久久婷婷人人澡人人喊人人爽| 亚洲作爱视频| 久久久久久久久久码影片| 99re6这里只有精品视频在线观看| 夜夜嗨av一区二区三区四季av| 在线观看视频一区二区| 欧美一区二区三区成人| 亚洲一区二区在线免费观看视频| 欧美一级专区免费大片| 中文精品视频一区二区在线观看| 老司机午夜精品| 久久人人97超碰精品888| 欧美日韩一区二区在线观看视频| 亚洲激情图片小说视频| 亚洲视频在线免费观看| 国产精品久久7| 久久综合中文| 亚洲成色777777女色窝| 亚洲美女在线看| 国内精品嫩模av私拍在线观看| 久久精品99国产精品日本| 欧美寡妇偷汉性猛交| 欧美顶级艳妇交换群宴| 蜜臀久久99精品久久久久久9| 99精品免费| 在线看日韩av| 国产欧美精品一区二区三区介绍| 久久精品国产亚洲a| 中日韩美女免费视频网址在线观看| 一区二区三区四区蜜桃| 一区二区三区波多野结衣在线观看| 亚洲欧洲在线观看| 亚洲人屁股眼子交8| 久久久五月天| 欧美不卡在线视频| 亚洲大胆人体视频| 亚洲视频图片小说| 欧美国产视频在线| 国产欧美一区二区视频| 欧美一级专区| 亚洲欧洲三级| 久久精品综合网| 久久精品免费看| 亚洲美女诱惑| 亚洲福利在线看| 蜜桃av一区二区在线观看| 久久久久9999亚洲精品| 久久午夜精品| 最新中文字幕亚洲| 日韩特黄影片| 久久精品国产亚洲aⅴ| 亚洲电影在线看| 小处雏高清一区二区三区| 亚洲欧美日韩综合aⅴ视频| 噜噜噜在线观看免费视频日韩| 欧美亚洲系列| 美日韩精品免费| 99精品久久久| 亚洲一区二区在线观看视频| 一区二区三区日韩精品视频| 欧美sm视频| 性欧美激情精品| 久久久99精品免费观看不卡| 欧美大尺度在线| 欧美视频在线不卡| 国产欧美在线观看| 在线观看一区欧美| 禁断一区二区三区在线| 欧美激情欧美狂野欧美精品| 一区二区av在线| 亚洲欧美成人一区二区在线电影| 亚洲毛片在线免费观看| 在线播放不卡| 欧美1区3d| 欧美成人精品h版在线观看| 亚洲精品小视频| 久久精品女人| 久久精品人人做人人爽| 99re视频这里只有精品| 欧美日韩性生活视频| 欧美日本不卡视频| 久久精品视频va| 9人人澡人人爽人人精品| 欧美高清日韩| 欧美成人蜜桃| 99精品视频免费全部在线| 伊人成人在线| 国产日韩欧美一区二区三区四区 | 日韩一级精品| 欧美国产丝袜视频| 欧美成人亚洲成人| 亚洲影院在线| 午夜一区二区三区在线观看| 一区二区日韩伦理片| 在线看日韩av| 亚洲风情亚aⅴ在线发布| 在线播放亚洲一区| 国产精品永久免费观看| 国产拍揄自揄精品视频麻豆| 国产精品视频一| 久久久久成人精品免费播放动漫| 日韩视频不卡中文| 亚洲黄色在线观看| 午夜精品久久久久久久99樱桃 | 欧美激情久久久久| 久久久精品动漫| 国产精品欧美一区喷水 | 欧美一级在线视频| 亚洲欧美日韩综合一区| 久久青草欧美一区二区三区| 亚洲淫性视频| 免费久久99精品国产自| 国产婷婷一区二区| 亚洲在线1234| 亚洲日本一区二区| 欧美激情一区二区三区| 欧美一区二区三区的| 欧美性猛交xxxx免费看久久久| 亚洲日本中文字幕区|