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

大龍的博客

常用鏈接

統計

最新評論

(轉)跨dll訪問STL的map的問題

問題:跨dll,針對Vector引用的傳遞沒有問題,但是Map就出現問題了。

原因分析:
一句話-----如果任何STL類使用了靜態變量(無論是直接還是間接使用),那么就不要再寫出跨執行單元訪問它的代碼。 除非你能夠確定兩個動態庫使用 的都是同樣的STL實現,比如都使用VC同一版本的STL,編譯選項也一樣。強烈建議,不要在動態庫接口中傳遞STL容器!!

STL不一定不能在DLL間傳遞,但你必須徹底搞懂它的內部實現,并懂得為何會出問題。
微軟的解釋:
http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b172396
微軟給的解決辦法:
http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b168958

1、微軟的解釋:
大部分C++標準庫里提供的類直接或間接地使用了靜態變量。由 于這些類是通過模板擴展而來的,因此每個可執行映像(通常是.dll或.exe文件)就會存在一份只屬于自己的、給定類的靜態數據成員。當一個需要訪問這 些靜態成員的類方法執行時,它使用的是“這個方法的代碼當前所在的那份可執行映像”里的靜態成員變量。由于兩份可執行映像各自的靜態數據成員并未同步,這 個行為就可能導致訪問違例,或者數據看起來似乎丟失或被破壞了。

可能不太好懂,我舉個例子:假如類A<T>有個靜態變量m_s,那么當1.exe使用了2.dll中提供的某個A<int>對象時,由于模板擴展機制,1.exe和2.dll中會分別存在自己的一份類靜態變量A<int>.m_s。
這樣,假如1.exe中從2.dll中取得了一個的類A<int>的實例對象a,那么當在1.exe中直接訪問a.m_s時,其實訪問的是 1.exe中的對應拷貝(正確情況應該是訪問了2.dll中的a.m_s)。這樣就可能導致非法訪問、應當改變的數據沒有改變、不應改變的數據被錯誤地更 改等異常情形。

原文:
Most classes in the Standard C++ Libraries use static data members directly or indirectly. Since these classes are generated through template instantiation, each executable image (usually with DLL or EXE file name extensions) will contain its own copy of the static data member for a given class. When a method of the class that requires the static data member is executed, it uses the static data member in the executable image in which the method code resides. Since the static data members in the executable images are not in sync, this action could result in an access violation or data may appear to be lost or corrupted.

1、保證資源的分配/刪除操作對等并處于同一個執行單元;
   比如,可以把這些操作(包括構造/析構函數、某些容器自動擴容{這個需要特別注意}時的內存再分配等)隱藏到接口函數里面。換句話說:盡量不要直接從dll中輸出stl對象;如果一定要輸出,給它加上一層包裝,然后輸出這個包裝接口而不是原始接口

2、保證所有的執行單元使用同樣版本的STL運行庫。
   比如,全部使用release庫或debug庫,否則兩個執行單元擴展出來的STL類的內存布局就可能會不一樣。

只要記住關鍵就是:如果任何STL類使用了靜態變量(無論是直接還是間接使用),那么就不要再寫出跨執行單元訪問它的代碼。

解決方法:
1. 一個可以考慮的方案
比如有兩個動態庫L1和L2,L2需要修改L1中的一個map,那么我在L1中設置如下接口
int modify_map(int key, int new_value);
如果需要指定“某一個map”,則可以考慮實現一種類似于句柄的方式,比如可以傳遞一個DWORD
不過這個DWORD放的是一個地址

那么modify_map就可以這樣實現:
int modify_map(DWORD map_handle, int key, int new_value)
{
    std::map<int, int>& themap = *(std::map<int, int>*)map_handle;
    themap[key] = new_value;
}

map_handle的值也首先由L1“告訴”L2:
DWORD get_map_handle();

L2可以這樣調用:
DWORD h = get_map_handle();
modify_map(h, 1, 2);

2. 加入一個額外的層,就可以解決問題。所以,你需要將你的Map包裝在dll內部,而不是讓它出現在接口當中。動態庫的接口越簡單越好,不好去傳太過復雜的東東是至理名言:)

posted on 2009-06-16 17:08 大龍 閱讀(2603) 評論(1)  編輯 收藏 引用

評論

# re: (轉)跨dll訪問STL的map的問題 2009-07-08 14:32 劉林

很好,很強大  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久一区二区| 欧美.com| 国产精品一香蕉国产线看观看| 久久久久久一区二区| 久久一区欧美| 欧美伦理a级免费电影| 欧美日韩成人综合天天影院| 欧美另类高清视频在线| 欧美日韩精品不卡| 欧美体内谢she精2性欧美| 国产伦精品一区二区三区在线观看 | 新狼窝色av性久久久久久| 亚洲欧美在线一区| 久久亚洲综合网| 欧美三级免费| 在线国产精品播放| 亚洲视频精选在线| 久久婷婷久久| 日韩天天综合| 久久视频一区二区| 欧美四级伦理在线| 激情欧美丁香| 亚洲永久免费视频| 久久久综合网| 一区二区日韩精品| 老司机一区二区| 国产精品国产三级国产aⅴ浪潮| 国产日韩高清一区二区三区在线| 亚洲成在人线av| 午夜精品美女自拍福到在线 | 一区二区久久久久久| 欧美一区二区免费| 欧美精品一区视频| 伊人色综合久久天天| 亚洲欧美日韩天堂| 亚洲日本中文字幕区| 欧美在线影院| 国产精品qvod| 亚洲麻豆一区| 欧美福利小视频| 久久精品亚洲热| 国产日韩精品一区二区| 一区二区三区av| 亚洲高清免费| 久久久视频精品| 国产午夜久久| 久久精品国产2020观看福利| 亚洲国产影院| 欧美大片一区二区三区| 亚洲高清视频中文字幕| 久久蜜桃资源一区二区老牛| 亚洲免费网站| 欧美日韩综合另类| 欧美激情第3页| 欧美va天堂在线| 欧美中文在线字幕| 国产一区二区三区高清在线观看| 亚洲欧美另类综合偷拍| 一本久久知道综合久久| 欧美日韩1区2区3区| 一个人看的www久久| 国产精品扒开腿爽爽爽视频| 一本大道久久精品懂色aⅴ| 欧美高清影院| 欧美成人精品激情在线观看| 亚洲大胆女人| 亚洲高清不卡av| 欧美网站在线| 亚洲欧美在线免费观看| 亚洲一区国产精品| 国产欧美短视频| 久久亚洲综合色一区二区三区| 欧美亚洲视频在线观看| 国产亚洲欧美一级| 欧美电影在线观看| 欧美日本一道本| 亚洲欧美中文日韩v在线观看| 一区二区三区欧美亚洲| 国产精品久久久久久久久久免费| 香蕉乱码成人久久天堂爱免费 | 宅男精品视频| 亚洲小说欧美另类社区| 国产日韩欧美综合一区| 久热精品视频| 欧美激情视频在线播放| 亚洲一区二区成人| 亚洲免费在线观看视频| 国产一本一道久久香蕉| 久久久久久久久久久久久9999| 久久综合伊人77777尤物| 一区二区精品| 香蕉久久夜色精品国产| 亚洲欧洲免费视频| 亚洲午夜av| 在线观看亚洲| 亚洲私拍自拍| 亚洲第一天堂av| 日韩视频一区二区在线观看 | 亚洲国产乱码最新视频| 亚洲精品日产精品乱码不卡| 国产伦一区二区三区色一情| 久久久久综合网| 欧美激情一区二区三区| 亚洲欧美日韩在线一区| 麻豆免费精品视频| 欧美一区二区三区四区在线 | 亚洲精品视频在线| 国产日韩一区二区| 欧美韩日一区二区三区| 国产精品卡一卡二卡三| 欧美激情亚洲精品| 国产一区观看| 亚洲午夜一二三区视频| 亚洲国产日韩在线| 性做久久久久久免费观看欧美 | 欧美性猛片xxxx免费看久爱| 玖玖精品视频| 国产午夜精品一区理论片飘花| 亚洲激情在线激情| 尹人成人综合网| 欧美一区二区三区在线看| 亚洲视频在线观看免费| 蜜臀99久久精品久久久久久软件| 久久精品成人一区二区三区| 国产精品毛片在线| 艳女tv在线观看国产一区| 亚洲精品综合在线| 欧美成人黄色小视频| 欧美一级专区| 亚洲欧美综合国产精品一区| 欧美日韩成人在线观看| 亚洲精品久久久久久久久久久久久 | 欧美在线视频导航| 亚洲一区二区少妇| 欧美日韩裸体免费视频| 欧美激情精品| 亚洲人成高清| 欧美精品在线一区二区| 亚洲电影免费在线观看| 伊人成人在线视频| 久久先锋影音| 欧美激情视频免费观看| 亚洲精选中文字幕| 欧美国产在线电影| 亚洲精品视频在线看| 亚洲日本成人网| 欧美另类高清视频在线| 日韩视频一区二区三区在线播放免费观看 | 欧美sm视频| 亚洲国产精品成人综合| 免费高清在线一区| 欧美激情一区二区三区四区| 亚洲黑丝在线| 欧美精品久久一区| 99精品国产热久久91蜜凸| 亚洲一区精彩视频| 久久久中精品2020中文| 最新国产成人av网站网址麻豆| 蜜桃av一区二区三区| 国产精品日日摸夜夜摸av| aa级大片欧美三级| 亚洲人精品午夜| 欧美精品系列| 在线综合视频| 久久全球大尺度高清视频| 国产亚洲一区二区三区在线观看| 亚洲综合成人婷婷小说| 性欧美video另类hd性玩具| 国产欧美日韩另类一区| 欧美自拍偷拍| 亚洲电影视频在线| 在线视频亚洲欧美| 欧美午夜大胆人体| 久久超碰97人人做人人爱| 欧美高清在线一区| 亚洲一区免费在线观看| 国产热re99久久6国产精品| 久久精品亚洲| 亚洲精品日韩在线观看| 先锋亚洲精品| 亚洲美女在线看| 国产亚洲第一区| 欧美高清视频一二三区| 亚洲尤物在线| 亚洲美女视频网| 免费在线看成人av| 亚洲小说欧美另类社区| 最新中文字幕一区二区三区| 国产精品拍天天在线| 欧美激情一区二区三区蜜桃视频| 亚洲在线观看| 亚洲毛片一区二区| 欧美黄色一区二区| 久久精品日产第一区二区三区| 亚洲精品在线观看免费| 国内自拍亚洲| 国产一区导航| 国产精品视频免费观看| 欧美精品色网| 欧美国产日韩亚洲一区|