我有两个 Visual Studio 2015 C++ 项目,即 A
和 B
。 A
被编译为共享库,B
使用它。它们都使用 A
中定义的类 Foo
。
问题出现在 B
中的一行,如下所示:
auto p = std::make_shared<Foo>(3);
引发 AccessViolationException
。
我意识到 A
和 B
以不同的方式识别 Foo
的大小,这使得 Foo
的构造函数> 在 B
中越过 A
的 make_shared
分配的内存边界。使用 Visual Studio 的 Watch 窗口,当代码在 A
模块中运行时,我可以看到 sizeof(Foo)
为 1832,而同一 watch 条目的值为 1813当代码在 B
模块中运行时。
我试图删除这两个项目的所有中间文件和输出文件并重建整个解决方案,但无济于事。
那么,单个类如何在不同的模块中以不同的大小出现呢?什么决定了一个类的内存布局?最后也是最重要的一点,我该如何解决这个问题?
最佳答案
除非满足以下条件之一,否则您不能从纯粹主义者的角度推断对象大小(或布局):
类型是 standard layout type .
或
关于构建的一切都是不变的 - 特别是编译器标志、使用的编译器、编译器版本等。
Finally and most importantly, how can I fix the problem ?
基本上你有 2 个选择。
使用标准布局类型或确保其构建方式相同。出于这个原因,大多数公开可用的 DLL 或共享库接口(interface)在其接口(interface)中不使用高级类型(即非标准布局),有些甚至保留 c。兼容代码(有时实际上与 c 兼容)。
关于c++ - 不同模块 (DLL) 的类大小不同。如何以及为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57988184/