跨越DLL边界的向量的内存重定位

时间:2016-09-01 05:38:58

标签: c++ visual-c++ memory-management dll

此问题与SO

中名称相似的人不重复
  

众所周知,如果DLL是静态链接的(/ MT标志在   MSVC),已分配内存的DLL必须解除分配;除此以外   内存释放将导致运行时错误。

问题在于:

  • 我在DLL中分配了std::vector,比如A
  • A将向量传递给DLL,比如B
  • DLL B将数据插入到矢量中。
  • 现在,如果DLL A试图破坏向量,它将面临错误。

我已经发现,如果我在将向量传递给std::vector::reserve之前使用B,要使向量足够大以容纳数据并防止内存重新分配 - 通常在项目插入期间发生 - 然后在尝试破坏向量时,我在A中没有收到错误。似乎在内存重新分配的情况下,B为其自己的堆中的向量分配。我的推理错了吗?我该如何防止这种情况?

1 个答案:

答案 0 :(得分:3)

最简单的方法是隐藏从dll公开的vector内部方法,这样你就可以在其他dll中查看const vector,但不能修改它。然后在dll B中创建一个新函数,代表调用者将该条目添加到向量中。

因此,您的vector仍然隐藏在dll B中以进行所有修改。