【问题标题】:Memory relocation for vector across DLL boundaries跨 DLL 边界的向量的内存重定位
【发布时间】:2017-01-08 20:39:53
【问题描述】:

此问题与SO中名称相似的问题不重复

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

问题来了:

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

我发现如果我在将向量传递给B 之前使用std::vector::reserve,以使向量足够大以容纳数据并防止内存重新分配——这通常发生在项目插入期间——那么我不会尝试破坏向量时在A 中出现错误。看来,在内存重新分配的情况下,B 会在自己的堆中分配向量。我的推理错了吗?我怎样才能防止这种情况发生?

【问题讨论】:

  • 避免使用c++运行时的静态链接
  • 另一个选项 - 使用 windows 堆覆盖此向量的分配器
  • @Serge 我必须使用静态链接来制作独立的可执行文件。您知道这种自定义分配器的任何示例吗?我之前尝试过编写自定义分配器,但这并不容易。谢谢
  • 您已经在使用DLL,这与您对独立可执行文件的声明相矛盾。不,不幸的是,我不知道。如果需要,我会在互联网上搜索。
  • @Serge 使用 DLL 并不一定意味着可执行文件不会运行。它实际上将在没有它们的情况下运行。独立我的意思是不要强迫用户在安装之前/之后安装 C++ Runtime。是的,我已经搜索过,但custom allocators 上的材料要么过于冗长,要么不相关。顺便说一句,为什么我需要避免静态链接?

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


【解决方案1】:

解决此问题的最简单方法是隐藏从 dll 暴露的 vector 内部方法,以便您可以获取 const vector 以在其他 dll 中查看,但不能修改它。然后在 dll B 中创建一个新函数,代表调用者将条目添加到向量中。

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

【讨论】:

  • 如果你达到这些长度,拥有一个使用你提到的 DLL B 中的函数的“阴影矢量类”不是更有意义吗? IE。对于向量类的用户来说,它看起来就像是一个普通向量。
  • @0xC0000022L 你的想法很棒。谢谢。
  • 我将混合你的想法。谢谢你们俩。如果我遇到任何困难,我会编辑我的问题,以便让那些以后可能面临同样问题的人有更好的见解。
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 2013-12-12
  • 2023-03-03
  • 1970-01-01
  • 2015-09-23
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多