c - C 运行时静态链接与动态链接中的内存分配

标签 c visual-c++ dynamic-linking static-linking msvcrt

我的程序架构涉及插件 (dll) 和 exe(很明显)。我们是唯一的插件提供商。有人告诉我,如果我们静态链接 c 运行时,在插件中分配内存然后在 exe 代码中释放它是一个潜在的问题。但是,如果我们动态链接它,则只有一个堆,而 c 运行时可以访问所有堆。我们根据这个建议切换到动态链接,但是我们从切换中看到的是与新运行时的分发和安装相关的头痛和麻烦。 (不知道我们在内存分配问题上避免了什么。)

内存分配的含义是什么?假设一个插件分配内存而 exe 释放它。静态与动态链接的 c 运行时之间是否存在不同的行为?如果我们使用插件,我们是否会遇到静态链接 c 运行时的问题?如果我们切换回静态链接,是否会扰乱内存泄漏检测和崩溃转储报告?

符合Which VC++ runtime version do I choose - static or dynamic?评论提出的一些问题具体Which VC++ runtime version do I choose - static or dynamic?

http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.100).aspx 也有一些讨论.

最佳答案

如果你想在一个模块中从堆中分配,而在另一个模块中释放,那么你只需动态链接运行时。此外,各方必须动态链接相同 运行时。一旦你这样做了,就不会有任何问题。

现在,这是对你的插件施加的一个相当严格的限制,你在做之前应该三思而后行。强制所有插件作者与您同步升级是一项沉重的负担。我建议您考虑重构您的界面,以便分配始终与单个模块中的释放配对。这解除了我上面描述的限制,让您的插件作者的生活更轻松。

至于为什么您仍然遇到运行时错误,这很难说。我的猜测是并非所有模块都链接到相同版本的运行时。


在评论中您声明您控制所有插件。这意味着我上面讨论的约束不是强加的,因为您很容易对所有模块使用相同的编译器版本。但是,与跨模块堆访问的动态链接规则仍然存在。您必须针对运行时的同一单一版本使用动态链接。

关于c - C 运行时静态链接与动态链接中的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8157891/

相关文章:

c - 如何在linux上用C语言解析xml文件

我可以在c中创建这种链表吗?

c - 在可变函数中提升整数

python - 静态链接 Python,但仍支持外部 .pyd 模块

c - 为什么在 C 中对动态链接的符号执行指针运算时会得到错误的结果?

c - 动态分配的内存发生了奇怪的事情

c++ - 如何使用 C++ 检查进程是否正在运行

arrays - 为什么 "array"在 Visual-C++ 中被标记为保留字?

在动态加载之前检查共享库的兼容性

linux - 动态链接器如何执行/proc/self/exe