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

大龍的博客

常用鏈接

統計

最新評論

(轉)跨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>
            欧美激情亚洲综合一区| 亚洲三级电影全部在线观看高清| 欧美视频一区二区在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久久久se| 久久久一二三| 欧美高潮视频| 国产精品av一区二区| 国产精品捆绑调教| 国内精品嫩模av私拍在线观看 | 欧美日韩在线不卡一区| 欧美日韩一区二区视频在线 | 欧美韩国日本一区| 亚洲国产成人不卡| 正在播放欧美一区| 欧美一区二区三区婷婷月色| 久久躁日日躁aaaaxxxx| 欧美激情片在线观看| 国产精品第十页| 精品二区视频| 亚洲特级片在线| 久久精品国产一区二区三| 亚洲国产成人久久综合一区| 亚洲一区二区三区在线观看视频| 久久久久久亚洲精品杨幂换脸 | 在线日韩成人| 亚洲网友自拍| 欧美国产亚洲另类动漫| 亚洲一区二区三区在线看 | 欧美男人的天堂| 国产日韩欧美在线一区| 一区二区激情小说| 米奇777在线欧美播放| 亚洲视屏一区| 欧美久久久久免费| 亚洲国产欧美一区二区三区同亚洲 | 麻豆av一区二区三区久久| 国产精品久久福利| 亚洲美女福利视频网站| 六月婷婷一区| 欧美一区二区三区久久精品| 欧美午夜一区| 9久草视频在线视频精品| 免费观看成人www动漫视频| 亚洲一区二区3| 欧美日韩亚洲一区二区三区| 亚洲人成啪啪网站| 免费欧美在线| 久久米奇亚洲| 国产在线乱码一区二区三区| 欧美一区二区三区播放老司机| 亚洲精品久久| 欧美精品国产精品日韩精品| 亚洲国产精品久久精品怡红院| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲一区二区在线视频| 国产精品国产亚洲精品看不卡15 | 看片网站欧美日韩| 久久精品动漫| 狠狠色丁香婷婷综合| 久久久精品网| 久久成人18免费网站| 国产亚洲精品一区二555| 欧美综合77777色婷婷| 国产精品中文字幕欧美| 狠狠久久婷婷| 蜜桃av噜噜一区| 久久久久国产一区二区三区| 伊人久久大香线| 乱码第一页成人| 久久久久久久精| 亚洲成在线观看| 亚洲国产免费看| 欧美日韩一区自拍| 午夜在线电影亚洲一区| 欧美一区二区三区精品| 极品少妇一区二区三区| 欧美成人午夜激情在线| 欧美大片免费久久精品三p| 一区二区电影免费观看| 亚洲欧美亚洲| 亚洲激情成人网| 99精品久久久| 国产亚洲精品aa| 91久久精品日日躁夜夜躁欧美| 欧美午夜宅男影院| 久久午夜视频| 欧美三级电影一区| 久久婷婷久久一区二区三区| 欧美成人午夜激情在线| 亚洲欧美清纯在线制服| 久久精品国产精品亚洲| avtt综合网| 久久精品国产综合| 亚洲校园激情| 久久综合网hezyo| 亚洲欧美自拍偷拍| 久久美女艺术照精彩视频福利播放| 一本色道久久综合亚洲精品不 | 欧美一区二区在线免费观看| 亚洲国产成人高清精品| 一本色道久久综合狠狠躁篇怎么玩| 国产亚洲精品久久久| 亚洲精品一品区二品区三品区| 国产欧美韩日| 日韩视频专区| 91久久国产综合久久| 欧美一区二区国产| 亚洲调教视频在线观看| 看片网站欧美日韩| 久久久999| 国产精品久久久91| 91久久久国产精品| 亚洲电影激情视频网站| 校园春色综合网| 午夜免费日韩视频| 欧美日韩综合不卡| 91久久综合| 亚洲国产精品成人| 久久久久免费观看| 久久人人爽爽爽人久久久| 国产精品免费一区二区三区在线观看| 欧美激情二区三区| 亚洲国产aⅴ天堂久久| 久久久久99精品国产片| 久久久久久久综合| 国产一区二区三区网站| 欧美激情在线观看| 国产精品久久久久久一区二区三区| 久久久久久久尹人综合网亚洲| 欧美视频一区在线观看| 最新国产の精品合集bt伙计| 亚洲第一在线综合在线| 久久久久久亚洲精品不卡4k岛国| 久久激情视频久久| 国产午夜精品一区理论片飘花| 亚洲午夜电影在线观看| 亚洲一区二区在线看| 欧美午夜理伦三级在线观看| 日韩视频在线一区二区| 一区二区三区精密机械公司 | 欧美福利在线| 亚洲经典在线| 亚洲美女色禁图| 欧美日韩dvd在线观看| 亚洲精品久久久久| 亚洲无亚洲人成网站77777| 欧美三级在线播放| 亚洲永久免费| 久久久久久亚洲精品杨幂换脸| 国产乱码精品一区二区三区五月婷| 亚洲无人区一区| 久久狠狠久久综合桃花| 狠狠综合久久| 欧美国产日本韩| 一区二区三区www| 欧美一区二区三区四区视频| 国产综合亚洲精品一区二| 久久久久一本一区二区青青蜜月| 欧美高清在线精品一区| 在线视频免费在线观看一区二区| 国产精品久久久久久模特| 久久精品30| 亚洲三级电影在线观看| 欧美一区二区私人影院日本 | 这里只有精品视频| 久久久成人网| 在线综合视频| 国产一区在线播放| 欧美黄色网络| 欧美一级视频| 亚洲日韩第九十九页| 欧美伊人久久久久久久久影院 | 亚洲午夜精品一区二区| 久久青青草原一区二区| 一区二区高清在线观看| 国产亚洲欧美日韩在线一区| 欧美第一黄色网| 亚洲欧美久久久| 亚洲国产精品视频一区| 欧美在线黄色| 一区二区三区高清在线| 伊人成年综合电影网| 欧美视频免费在线观看| 久久精品一区蜜桃臀影院| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 国产人成一区二区三区影院| 亚洲免费成人av| 久久狠狠婷婷| 亚洲私人黄色宅男| 最新中文字幕一区二区三区| 国产欧美精品一区| 欧美日韩亚洲三区| 能在线观看的日韩av| 午夜精品一区二区三区电影天堂 | 99视频日韩| 亚洲电影第1页| 国产尤物精品| 国产视频在线观看一区二区三区| 欧美日韩在线直播|