【问题标题】:strange std::vector problem with uint32_t on Visual Studio 2008Visual Studio 2008 上的 uint32_t 出现奇怪的 std::vector 问题
【发布时间】:2009-11-17 09:41:13
【问题描述】:

这很好用:

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

但这会引发 std::length_error:

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

好像是resize触发的,因为

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

触发调试断言"iterator not dereferencable"

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



更新: 该项目中的静态和动态链接依赖项的老鼠巢使得查找有问题的库过于耗时。我放弃并从源头重建了每个依赖项。我失去了两天的生命,仍然不知道问题出在哪里,但是应用程序运行了!感谢您的帮助。

【问题讨论】:

  • 由于 STL 在源代码中,您只需将调试器设置为在抛出异常时停止并检查那里有什么问题。
  • 出现问题的最小可编译源,拜托!
  • 什么是 uint32_t 定义为,例如。使用“unsigned __int32”执行上述操作非常适合我......
  • 在我的机器上工作 :-) pastebin.org/54412
  • 它在模板方法的深处炸毁,签名为“template inline _FwdIt _Uninit_copy(_InIt _First, _InIt _Last, _FwdIt _Dest, _Alloc&, _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag) “我没有希望解析。如果可以信任调试器,那么在调用此方法时,迭代器参数似乎是伪造的。

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


【解决方案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。)如果您在这样做时没有发现问题,请将示例附加到您的问题中。

【讨论】:

  • 这确实是我经历了几个小时的过程。我有一个非常复杂的项目,它显示了将我的两行代码添加到 main() 顶部的问题,并且我有一个简单的项目,其中相同的两行正确运行,正如几个人在这里指出的那样。我正在逐渐将两者转变为彼此,以期找到罪魁祸首。
  • @maxfurni:根据我的经验,通过减少出现问题的代码而不是扩展其他代码,您似乎更有可能找到问题。 :)
  • 请注意,对于 C++,main() 的第一行不一定是正在执行的代码的第一行。全局变量可以更早运行。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你能检查你的实现是否有两个或更多的 uint32_t 类型定义吗?特别是在不同的命名空间下? (我知道机会非常渺茫,但它可能是值得的——在寻求平台兼容性的过程中,不同的库会尝试将特定的内存大小映射到一种类型,其中一个可能会出错)。

    【讨论】:

    • 如我的代码示例中所述,行为与 vector 相同
    【解决方案4】:

    VC++ 2008 不提供 ISO C99 标头,因此您必须以某种方式提供了定义;也许定义有缺陷。

    【讨论】:

    • 如我的代码示例中所述,行为与 vector 相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多