C++ 分配C++;跨MSVCRT版本的对象

C++ 分配C++;跨MSVCRT版本的对象,c++,static-linking,msvcrt,C++,Static Linking,Msvcrt,我有VS2010,我需要构建应用程序。 此外,我还使用VS2005构建了.dll和.lib以及.h。 这个库依赖于log4cxx.dll(我构建了2010并下载了2005二进制文件)。 当我调用库接口方法返回对构建对象的引用时,它抛出AV异常。我无法使用其他版本构建我的应用程序,我已尝试更改为多线程调试我的应用程序类型。您获得的对象可能具有其他内存布局。 如果您正在跨越运行时边界传递C++对象,则应该确保接收对象具有相同的布局。例如,如果VS2005编译器对其字段进行了重新排序以进行优化,而VS

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

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

一个运行时中的对象分配和另一个运行时中的解除分配也存在问题


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

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

一个运行时中的对象分配和另一个运行时中的解除分配也存在问题


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

情况更有趣:我有VS2005 dll,它依赖于log4cxx VS2008,我正在尝试从VS2010链接库。它在这样一个点上崩溃:我在应用程序中创建vector并将其传递给库,然后它崩溃release@deeptowncitizen这是非常糟糕的情况:)但正如我所说的,在运行时之间传递不是专门为此设计的对象(std::vector不是)是危险的。即使使用一个版本的VS,也可能会出现错误,例如,如果一方定义了SECURE_SCL,而另一方没有定义。对象会有所不同。我想这是另一回事:我在我的应用程序中在堆栈上创建向量,并通过引用函数传递它(这是库中的const方法)。所以这里是不应该有一些内存问题。我说得对吗?库只需调用我的内存向量push_不,有很多问题。不要认为它是你的向量,它是你的记忆。您只将指针(引用是ptr的语法糖)传递给模块,它是模块的向量。若布局发生变化,模块的矢量场将和原始场不匹配。另一个问题是,如果布局正常,如果模块调用push_back,并且达到了最大容量,它首先在另一个运行时中释放内存,然后在模块的运行时中分配新内存。巴阿德。清楚的或者我需要改进一些地方?我已经尝试在vector中保留足够的容量,但DLL主机必须清除它,然后添加项=)太糟糕了(情况更有趣:我有VS2005 dll,它依赖于log4cxx VS2008,我试图从VS2010链接库。它在这样一个点上崩溃:我在应用程序中创建vector,并将其传递给库,然后它崩溃release@deeptowncitizen这是非常糟糕的情况:)但正如我所说,传递的对象不是专门为此设计的(std::vector不是)在运行时之间是危险的。即使使用一个版本的VS,也可能会出现错误,例如,如果一方定义了SECURE_SCL,而另一方没有定义。对象会有所不同。我认为还有另一件事:我在我的应用程序中在堆栈上创建vector,并通过引用函数传递它(这是库中的const方法).所以这里不应该有一些内存问题。我说的对吗?库只是调用我的内存向量的push_back不,有很多问题。不要认为它是你的向量,它是你的内存。你只传递指针(引用是ptr的语法糖)对于模块,它被解释为模块的向量。如果布局更改,模块的向量字段将与原始字段不匹配。另一个问题是,如果布局正常,如果模块调用push_back,并且达到最大容量,它将首先释放内存(在另一个运行时!!)然后在模块的runtime.baaad.Clear中分配新的?或者我需要优化一些地方?我已经尝试在vector中保留足够的容量,但DLL master必须清除它,然后添加项=)太糟糕了(