在dll之间使用stl时遇到问题

时间:2012-06-07 14:08:00

标签: c++ windows dll stl

我在dll中有一个向量(或字符串),通过它的引用或指针在另一个dll中修改它是否安全,比如将一个新成员推送到向量或更改字符串的值?不知怎的,当我这样做时有时会发生崩溃,我不知道为什么。

如果我只是在另一个dll中读取它,使用const指针或引用,它绝对安全吗?

使用stlport怎么样?它更安全吗?

2 个答案:

答案 0 :(得分:2)

如果修改STL容器,删除或添加新元素,通常涉及分配/释放内存。如果你使用驻留在一个DLL中的分配器分配一些内存,然后在不同的DLL中释放内存 - 使用另一个分配器,生活在另一个DLL中 - 那么你可能会遇到麻烦。我想这可能就是你所经历的。

一种可能的解决方案是将STL容器封装在类中,并通过该类的函数访问STL容器的函数。这个想法是你在一个DLL中实现了类,每当你操作那个对象(以及STL容器)时,你只使用一个C ++分配器。

如果你操纵在另一个DLL中的一个DLL中创建的const对象(如你所说:'只读'访问权限)那么它不涉及C ++分配器,所以它应该是安全的。

答案 1 :(得分:1)

从两个DLL访问stl容器是安全的(读取和写入),前提是这两个DLL使用相同的STL变体。 Visual Studio提供了两种STL变体,一种版本变体和一种带有附加检查的调试变体(在调试模式下启用或通过定义_SECURE_SCL)。这两个变种不兼容!混合这两种模式(例如,因为一个DLL在调试模式下编译而另一个在发布模式下)会导致神秘的崩溃,因为两种变体之间的容器大小不同。

有关详细信息,请参阅https://connect.microsoft.com/VisualStudio/feedback/details/524141/serious-bug-when-using-secure-scl-0-c