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

大龍的博客

常用鏈接

統計

最新評論

(轉)跨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>
            嫩模写真一区二区三区三州| 一区二区国产日产| 欧美日本精品| 欧美日韩少妇| 欧美三级欧美一级| 国产日韩欧美日韩| 在线免费观看成人网| 亚洲国产日韩欧美| 久久高清国产| 亚洲视频免费看| 亚洲欧洲精品一区二区三区波多野1战4 | 国产精品一卡二卡| 国内外成人免费激情在线视频 | 亚洲私人影院在线观看| 亚洲欧美美女| 欧美1区2区| 亚洲视频在线看| 久久视频免费观看| 欧美日韩免费观看一区| 欧美国内亚洲| 亚洲视频在线观看网站| 蜜乳av另类精品一区二区| 欧美日韩国语| 韩国成人理伦片免费播放| 亚洲日本欧美日韩高观看| 亚洲一区二区高清视频| 蜜桃av综合| 亚洲视频香蕉人妖| 免费人成网站在线观看欧美高清| 国产精品久久国产愉拍| 亚洲成色www久久网站| 亚洲在线第一页| 亚洲激情视频在线播放| 欧美一区二区三区在线免费观看| 欧美激情一区二区在线| 国产亚洲一级高清| 亚洲一区制服诱惑| 亚洲国产天堂久久综合网| 久久久福利视频| 国产一区二区三区高清播放| 亚洲女女女同性video| 亚洲精品在线观| 蜜桃精品久久久久久久免费影院| 国产欧美综合一区二区三区| 99视频一区| 亚洲高清不卡在线| 久久最新视频| 一区二区在线观看视频| 久久精品中文| 欧美一级大片在线免费观看| 国产精品美女www爽爽爽| 在线亚洲激情| 99国产精品私拍| 欧美美女bbbb| 亚洲一区二区黄| 在线中文字幕日韩| 欧美午夜电影完整版| 亚洲欧美另类中文字幕| 亚洲欧美日韩成人| 国产自产精品| 乱人伦精品视频在线观看| 久久激五月天综合精品| 依依成人综合视频| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品sm| 亚洲高清av在线| 国产婷婷97碰碰久久人人蜜臀| 亚洲视频一区在线| 在线亚洲欧美视频| 国产精品理论片| 久久成人18免费网站| 亚洲欧美日韩精品一区二区| 国产欧美精品在线| 久久一区视频| 欧美福利小视频| 亚洲图片激情小说| 亚洲午夜伦理| 国产视频亚洲精品| 巨胸喷奶水www久久久免费动漫| 久久香蕉国产线看观看网| 亚洲精品社区| 午夜综合激情| 亚洲精品视频在线播放| 亚洲少妇最新在线视频| 国产一区二区激情| 亚洲国产成人av| 国产精品xvideos88| 久久久久这里只有精品| 欧美国产免费| 欧美一区二区免费观在线| 久久永久免费| 欧美一区91| 欧美激情导航| 久久久91精品国产| 欧美另类在线播放| 久久性色av| 国产精品日韩| 亚洲高清不卡在线| 国产一区二区日韩精品欧美精品| 亚洲国产成人在线| 国产一区二区三区黄视频| 亚洲精品九九| 一区二区在线视频| 亚洲综合另类| 亚洲每日在线| 久久国产精品久久久| 一区二区三区高清视频在线观看| 香港成人在线视频| 亚洲视频一区二区在线观看| 玖玖玖免费嫩草在线影院一区| 亚洲夜间福利| 欧美91视频| 久热这里只精品99re8久| 国产精品天美传媒入口| 91久久精品网| 亚洲国产精品一区二区www在线 | 亚洲少妇在线| 久久久久九九九九| 国产精品久久久久一区| 亚洲欧洲精品一区二区| 国内精品久久久久影院优| 亚洲特色特黄| 亚洲午夜久久久| 欧美国产精品人人做人人爱| 老司机67194精品线观看| 激情成人中文字幕| 久久久久久久久岛国免费| 亚洲欧美制服另类日韩| 欧美日韩精品免费观看| 最新国产の精品合集bt伙计| 亚洲二区视频| 久久天天躁狠狠躁夜夜爽蜜月| 久久av一区二区三区亚洲| 国产精品久久久久久av下载红粉 | 亚洲欧美日韩在线| 亚洲免费影院| 国产精品亚洲欧美| 亚洲午夜在线视频| 午夜精品久久久久久久男人的天堂| 欧美老女人xx| av72成人在线| 亚洲欧美激情诱惑| 国产精品婷婷| 久久精品亚洲乱码伦伦中文| 久久影视精品| 亚洲国产精品ⅴa在线观看| 免费不卡在线观看| 91久久夜色精品国产网站| 在线亚洲欧美专区二区| 国产精品国产三级国产专播品爱网| 亚洲女性裸体视频| 久久亚洲美女| 亚洲免费av片| 欧美午夜不卡在线观看免费 | 欧美精品三区| 亚洲毛片视频| 欧美综合77777色婷婷| 黄色成人av在线| 欧美精品91| 亚洲一二三区精品| 久久最新视频| 中文高清一区| 国产综合色在线| 欧美激情视频免费观看| 一区二区三区视频观看| 欧美诱惑福利视频| 亚洲国产电影| 国产精品美女久久久| 玖玖综合伊人| 亚洲性视频h| 欧美成人精品一区| 国产精品久久久免费| 亚洲国产女人aaa毛片在线| 日韩午夜在线| 欧美阿v一级看视频| 国产精品免费网站| 欧美一区二区高清在线观看| 蜜臀a∨国产成人精品| 一级日韩一区在线观看| 国产视频在线一区二区| 欧美精品一区二区三区视频| 亚洲欧美经典视频| 亚洲国产日日夜夜| 久久激情视频免费观看| 亚洲美女黄网| 国内精品久久久久影院色| 欧美日韩精品免费观看视频| 久久久999精品| 亚洲一级片在线观看| 欧美激情精品久久久| 欧美一区二区三区免费在线看| 亚洲激情在线观看| 欧美视频国产精品| 亚洲日韩中文字幕在线播放| 国产精品一页| 欧美成人一区二区三区在线观看| 亚洲欧美日本另类| 亚洲美女色禁图| 久久夜色精品| 欧美亚洲视频|