c++ - 不同模块 (DLL) 的类大小不同。如何以及为什么?

标签 c++ memory shared

我有两个 Visual Studio 2015 C++ 项目,即 ABA 被编译为共享库,B 使用它。它们都使用 A 中定义的类 Foo

问题出现在 B 中的一行,如下所示:

auto p = std::make_shared<Foo>(3);

引发 AccessViolationException

我意识到 AB 以不同的方式识别 Foo 的大小,这使得 Foo 的构造函数> 在 B 中越过 Amake_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++ - 不同模块 (DLL) 的类大小不同。如何以及为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57988184/

相关文章:

c++ - 有没有办法检查 fmt::output_file 是否已成功打开进行写入

c# - 在 C# 中使用外部 C++ 库

c - 与 IEEE-754 相比,内存中的浮点位模式按位反转了吗?

c# - 在 C# 中运行仍处于打开状态的 exe 文件

php - 具有语法高亮显示的共享在线代码查看工具?

c++ - 如何存储这种图形?

c++ - 以下代码的输出是什么(答案因不同的编译器而异)?

java - 小部件是否有内存限制?

Android RemoteViews : setImageViewResource() vs setImageViewUri() vs setImageViewBitmap()

c++ - "undefined reference to"共享库中的许多(全部?)函数(新手)