2

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

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

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

4

2 回答 2

2

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

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

如果您操作const在另一个 DLL 中的一个 DLL 中创建的对象(如您所说:“只读”访问),那么它不涉及 C++ 分配器,因此它应该是安全的。

于 2012-06-07T14:18:29.240 回答
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

于 2012-07-26T06:29:57.030 回答