我在 dll 中有一个向量(或字符串),通过它的引用或指针在另一个 dll 中修改它是否安全,例如将新成员推送到向量或更改字符串的值?当我这样做时,有时会发生崩溃,我不知道为什么。
如果我只是在另一个 dll 中读取它,使用 const 指针或引用,它绝对安全吗?
使用stlport怎么样?它更安全吗?
如果您修改 STL 容器、删除或添加新元素,通常会涉及分配/释放内存。如果碰巧您使用驻留在一个 DLL 中的分配器分配一些内存,然后在另一个 DLL 中释放内存 - 使用另一个分配器,位于另一个 DLL 中 - 那么您可能会遇到麻烦。我想这可能是你正在经历的。
一种可能的解决方案是将您的 STL 容器封装在您的类中,并通过该类的函数访问 STL 容器的函数。这个想法是,您在一个 DLL 中实现了该类,并且每当您操作该对象(以及 STL 容器)时,您只使用一个 C++ 分配器。
如果您操作const
在另一个 DLL 中的一个 DLL 中创建的对象(如您所说:“只读”访问),那么它不涉及 C++ 分配器,因此它应该是安全的。
从多个 DLL 访问 stl 容器是安全的(读取和写入),前提是两个 DLL 使用相同的 STL 变体。Visual Studio 提供了两个 STL 变体,一个发布变体和一个带有附加检查的调试变体(在调试模式下启用或通过定义 _SECURE_SCL 启用)。这两种变体不兼容!混合这两种模式(例如,因为一个 DLL 在调试模式下编译而另一种在发布模式下编译)可能会导致神秘的崩溃,因为两种变体之间的容器大小不同。