2012-06-07 64 views
2

我在dll中有一個向量(或字符串),是否可以通過其引用或指針在另一個dll中修改它,比如將新成員推送到向量或更改字符串的值?不知何故,當我這樣做的時候會發生崩潰,我不知道爲什麼。在dll之間使用stl遇到問題

如果我只是在另一個DLL中讀取它,使用const指針或引用,它是絕對安全的嗎?

如何使用stlport?它更安全嗎?

回答

2

如果您修改STL容器,刪除或添加新元素,它通常涉及分配/釋放內存。如果碰巧你使用駐留在一個DLL中的分配器分配一些內存,然後在另一個DLL中釋放內存 - 使用另一個分配器,生活在另一個DLL中 - 那麼您可能會遇到麻煩。我想這可能是你正在經歷的。

一個可能的解決方案是將您的STL容器封裝在您的類中,並通過該類的函數訪問STL容器的函數。這個想法是,你在一個DLL中實現了類,並且每當你操作該對象(以及STL容器)時,只使用一個C++分配器。

如果您操縱在另一個DLL中的一個DLL中創建的const對象(如您所說:'只讀'訪問),那麼它不涉及C++分配器,因此它應該是安全的。

1

如果兩個DLL使用相同的STL變體,從多個DLL訪問stl容器是安全的(讀取和寫入)。 Visual Studio提供了兩個STL變體,一個發佈變體和一個帶有附加檢查的調試變體(在調試模式下或通過定義_SECURE_SCL啓用)。這兩個變體不兼容!混合這兩種模式(例如,因爲一個DLL在調試模式下編譯而另一個DLL在釋放模式下)會導致神祕的崩潰,因爲兩個變體的容器大小不同。

有關更多信息,請參閱https://connect.microsoft.com/VisualStudio/feedback/details/524141/serious-bug-when-using-secure-scl-0-c