【问题标题】:Allocate C++ object across MSVCRT versions跨 MSVCRT 版本分配 C++ 对象
【发布时间】:2013-03-14 12:35:09
【问题描述】:

我有 VS2010,我需要构建应用程序。 我也有 .dll 与 .lib 和 .h 用 VS2005 构建。 该库依赖于 log4cxx.dll(我构建了 2010 并下载了 2005 二进制文件)。 当我调用返回对构建对象的引用的库接口方法时,它会抛出 AV 异常。我无法使用其他版本构建我的应用,并且我已经尝试更改为多线程调试我的应用类型。

【问题讨论】:

    标签: c++ static-linking msvcrt


    【解决方案1】:

    你得到的对象很可能有另一个内存布局。 如果您跨运行时边界传递 c++ 对象,您应该确保接收对象具有相同的布局。例如,如果 VS2005 编译器已对其字段重新排序以进行优化,而 VS2010 则以其他方式完成。或者您使用的类之一(例如 std::string)在版本之间发生了变化。了解如何从 COM 方法返回对象。

    一个运行时中的对象分配和另一个运行时中的释放也存在问题......

    作为一种解决方案,您可以尝试安装 VS2005,但不能保证最终结果相同

    【讨论】:

    • 情况更有趣:我有 VS2005 dll,它依赖于 log4cxx VS2008,我正在尝试从 VS2010 链接库。它在这样一个点崩溃:我在应用程序中创建向量并将其传递给库,它在发布时崩溃
    • @deeptowncitizen 情况真的很糟糕 :) 但正如我所说,在运行时之间传递不是专门为此设计的对象(std::vector 不是)是危险的。即使使用一个版本的 VS,您也可能会遇到错误,例如,如果一侧定义了 SECURE_SCL 而另一侧没有。对象会有所不同。
    • 我认为这是另一回事:我在我的应用程序的堆栈上创建向量并通过引用函数(这是库中的 const 方法)传递它。所以这里不应该是一些内存问题。我对吗?库只是调用我的内存向量的 push_back
    • 不,有很多问题。不要以为它是你的载体,它是你的记忆。您只将指针(引用是 ptr 的语法糖)传递给模块,它是解释模块的向量。如果布局更改模块的矢量字段将与原件不匹配。另一个问题,如果布局没问题,如果模块调用 push_back,并且达到最大容量,它首先会释放内存(在另一个运行时!!),然后在模块的运行时分配新的内存。巴阿德。清除?还是我需要细化一些地方?
    • 我已经尝试在vector中保留足够的容量,但是DLL master必须清除它然后添加项目=)太糟糕了(
    猜你喜欢
    • 2013-11-27
    • 2010-11-23
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多