【发布时间】:2014-06-30 17:09:47
【问题描述】:
如果我们打算使用来自不同编译器的 DLL,我必须向我的团队解释为什么从 DLL 导出类不是一个好的解决方案。但我找不到证明。标准中是否有诸如“编译器不应该提供向后兼容性,不同的编译器也可以实现自己的命名导出符号的风格,因此从 DLL 导出的类可以由同一个编译器使用”? 我知道这是真的,但我怎么能证明呢?另外,如果您知道我的其他论点,请帮忙!
【问题讨论】:
-
最大的问题是CRT不兼容。使用 Visual Studio,每个编译器版本(甚至像 Release/Debug 这样的配置)都有一个独立的堆。在 1 个堆中分配内存的问题你不能在第二个堆中安全地释放它。来自不同堆的空闲内存块通常会导致堆损坏,这可能看起来是随机的,因为应用程序可能不会在堆损坏后立即崩溃。使用 .dll 除非您隔离内存分配/解除分配,否则将所有分配/解除分配保持在同一个堆中并不容易。
-
如果库提供删除函数,或者对于类,如果导出的类可访问抛出函数(即分配将在 DLL 端)并具有析构函数,则可以解决独立堆的问题,不是吗?
-
看看this list,几乎所有的命中都是由导出非纯类造成的脆弱紧密耦合引起的问题。
标签: c++ class dll compiler-construction export