C++ STL 和 DLL

标签 c++ dll stl

我知道这个问题已经以类似的方式被问过很多次,但我不确定我是否已经完全掌握了这里涉及的概念。我目前正在做一些小的学习项目(因为我有一段时间停止使用 C++ 并想重新使用它)并且从我读到的内容来看,在 DLL 中使用 STL 时存在一些问题.

但是,根据我收集到的信息,有两种方法可以避免可能出现的问题。

方法1:DLL的用户必须有相同的编译器和相同的C运行时库。

方法 2:隐藏所有 STL 类成员以防止直接访问。

然而,当涉及到方法2时,我知道客户端不能直接访问STL类成员以使该方法起作用,但这是否意味着:

//Note all the code in this example was written directly in my web broswer with no checking. 

#ifdef SAMPLEDLL_EXPORTS
#define SAMPLE_API __declspec(dllexport) 
#else
#define SAMPLE_API __declspec(dllimport) 
#endif

class SAMPLE_API SampleClass
{
  std::map<int, std::string> myMap;

  public:
  SampleClass();
  ~SampleClass();

   void addSomething(int in_Key, char* in_Val)
   {
     std::string s(in_Val);
     myMap.insert( std::pair<int, std::string>(in_Key, s) );
   };

   bool getHasKey(int in_Key)
   {
      return myMap.find(in_Key) != myMap.end(); 
   };

};

有用吗?

最佳答案

正如 Hans Passant 在评论中指出的那样,您的示例有点可疑,因为您将所有方法定义都放在了内联中。但我们假设您将定义移动到一个单独的 .cpp 文件,然后将其构建到一个 DLL 中。

这不安全。

从一开始,我们就有这个:

class SAMPLE_API SampleClass
{
  std::map<int, std::string> myMap;

我不需要进一步查看,因为我们可以立即看到 SampleClass 的大小取决于 std::map 的大小,而标准并未指定。因此,虽然您可以说 SampleClass 不会“公开”其 map ,但它实际上有点公开。您可以使用 Pimpl 技术来克服这个问题,并从您的类的 ABI 中真正隐藏 map 。

关于C++ STL 和 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19329596/

相关文章:

c# - 当 c# 访问 c++ dll 时尝试读取或写入 protected 内存错误

c++ - 制作没有依赖的DLL文件

c++ - 如何从 DLL 导出数组?

c# - 在dll中打包xml文件,c#

带指针的映射的 C++ 输出

c++ - 从 lambda 捕获中捕获变量会出错?

c++ - 使用 constexpr C 字符串作为编译器错误消息

c++ - 在C/C++中快速读取多个文件的某些字节

c++ - 哪个STL容器可以双向增长?

c++ - 为什么这个仿函数的析构函数被调用两次?