【发布时间】: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