在Visual Studio 2008上使用uint32_t的奇怪的std :: vector问题

时间:2009-11-17 09:41:13

标签: c++ stl visual-c++

这很好用:

std::vector<int> v;  
v.push_back(123);

但这会抛出一个std :: length_error:

std::vector<uint32_t> v;// or vector<unsigned __int32>  
v.push_back(123);

似乎是通过调整大小来触发的,因为

std::vector<uint32_t> v;  
v.reserve(2);  

触发调试断言"iterator not dereferencable"

这在Visual Studio 2008上发生,但相同的代码在Mac和Linux上运行良好。任何人都可以建议一种缩小搜索范围的方法吗?



更新: 在这个项目中,鼠标的静态和动态链接依赖项使得查找违规库变得非常耗时。我放弃并重建了源的每一个依赖。我失去了两天的生活,仍然不知道问题的确切位置,但应用程序运行!谢谢你的帮助。

4 个答案:

答案 0 :(得分:1)

这个

#include <iostream>
#include <vector>

int main()
{
    std::vector<unsigned __int32> v;
    v.reserve(2);
    std::cout << v.capacity() << '\n';
    return 0;
}
在VS 2008中,

在我没有任何打嗝的情况下运行。它打印2

这对你有什么用?如果它也有效,那么我的前几个猜测是:

  • 之前曾在某处调用未定义的行为。当执行到你显示的代码时,所有的赌注都会被取消。
  • 这是跨越DLL边界,并且您将使用不同设置构建的DLL / EXE链接在一起。

了解这一点的方法是将其提炼到展示行为的最小可能测试用例。 (这不应超过50LoC,理想情况下,它是10.)如果您在执行此操作时未发现问题,请将示例附加到您的问题中。

答案 1 :(得分:0)

由于示例代码正常,您的样本必须是错误的:-)
尝试通过小步骤使您的示例更像真实代码来更接近问题。在某些时候它应该停止工作,然后你可以找出罪魁祸首。

答案 2 :(得分:0)

你能检查你的实现是否有两个或更多的uint32_t的typedef?特别是在不同的名称空间下(我知道机会很小,但它可能是值得的 - 在寻求平台兼容性时,不同的库会尝试将特定的内存大小映射到一个类型,其中一个可能已经滑落了。)

答案 3 :(得分:0)

VC ++ 2008不提供ISO C99标题,因此您必须以某种方式提供该定义;也许这个定义是有缺陷的。