C++ 跨VS项目的STL向量损坏

C++ 跨VS项目的STL向量损坏,c++,visual-studio,stl,vector,C++,Visual Studio,Stl,Vector,我有一个VisualStudio2005解决方案,其中包含几个独立构建的项目。主项目静态链接其他项目。我在一个静态链接库中发现了非常奇怪的STL向量损坏。例如,我声明一个std::vector,然后执行排序(thatVector.begin(),thatVector.end()),但当我调试它并查看反汇编时,我看到了以下内容: std::vector<SomeOtherClass<SomeOtherTemplateType>,std::allocator<SomeOthe

我有一个VisualStudio2005解决方案,其中包含几个独立构建的项目。主项目静态链接其他项目。我在一个静态链接库中发现了非常奇怪的STL向量损坏。例如,我声明一个std::vector,然后执行
排序(thatVector.begin(),thatVector.end())
,但当我调试它并查看反汇编时,我看到了以下内容:

std::vector<SomeOtherClass<SomeOtherTemplateType>,std::allocator<SomeOtherClass<SomeOtherTemplateType> > >::begin
std::vector::begin
不可思议的是,
SomeOtherClass
SomeOtherTemplate
都是在主项目中声明的,所以这个库应该完全不知道它们

我尝试冻结所有其他线程,认为其中一个线程可能正在腐蚀
thatVector
,但没有骰子。我完全不知所措。有人经历过这样的事情吗

编译信息: -主程序/Zi,自定义优化(基本上是可调试的发布版本) -静态库/Zi,/Od

链接信息:
/调试问题是库和程序是用不同的编译器选项编译的。因此,您得到了不同的迭代器实现,但具有相同的签名。是的,Microsoft建议编译多个版本的静态链接库,并将可执行文件链接到相应的库。

向量是一种模板类型,这意味着引用向量的每段代码都必须知道完整的类型。您的库不仅可以了解其他类和其他模板类型,还必须了解它们才能引用它们的向量

在这种情况下,向量的完整类型为:

std::vector<SomeOtherClass<SomeOtherTemplateType>,std::allocator<SomeOtherClass<SomeOtherTemplateType> > >
std::vector …这可能在您的代码中声明如下:

vector<SomeOtherClass<SomeOtherTemplateType> > thatVector;
vector表示向量;
…分配器解析为默认模板参数

现在,谈谈你的腐败问题。关于腐败的本质并没有太多的信息,所以我将做一些假设。Nameley指出,您在一个模块中分配向量,并尝试在另一个模块中使用它(如
推回
到它),而当您在另一个模块中执行某些操作时,实际发生损坏。令人沮丧的是,在许多此类案件中,腐败并未在腐败发生时被发现或报告。它通常在以后的完全无关的代码中被检测到

如果上述假设正确,我对可能的原因有2点建议:

  • 这些模块没有链接到相同版本和风格的运行库。请尝试确保每个模块链接到同一个CRT(例如,Windows下的多线程调试DLL),然后重试。大多数时候,这就是问题所在

  • 您正在使用不同的编译器(或同一编译器的不同版本)来创建不同的模块。在本例中,向量在一个模块中看起来像一个东西,在另一个模块中看起来像其他东西。有许多线程间接地讨论了此类问题,请参见一个示例


  • 你用什么模板声明std::vector thatVector?你在优化关闭时得到相同的模板实例化信息吗?检查这个线程:我实际上是在分配向量并在同一个模块中使用它。然而,不知何故,当我逐步了解它时,它包含了该模块中不存在的类。