代码之家  ›  专栏  ›  技术社区  ›  eplawless

STD::向量栈之间的C++参数值变化

  •  4
  • eplawless  · 技术社区  · 15 年前

    std::vector<V3x> 哪里 V3x std::length_error 要引发的异常:

    std::vector<V3x> vertices;
    int vertexCount = computeVertexCount();
    vertices.resize(vertexCount); // throws std::length_error
    

    computeVertexCount() 返回的值为 35 ,远低于 vector::max_size()

    std::vector ,以实现以下两个功能。

    void resize(size_type _Newsize, _Ty _Val)
        {   // determine new length, padding with _Val elements as needed
        if (size() < _Newsize)
            // NOTE: here, _Newsize - size() = 35
            _Insert_n(end(), _Newsize - size(), _Val); 
        else if (_Newsize < size())
            erase(begin() + _Newsize, end());
        }
    
    void _Insert_n(const_iterator _Where,
        size_type _Count, const _Ty& _Val)
        {   // insert _Count * _Val at _Where
            // NOTE: here, _Count = 3435973836
            ...
        }
    

    _Count 参数在 resize() _Insert_n() ,值从35更改为3435973836。我假设内存已经被破坏了,但我不知道这是怎么回事。

    有人知道是什么导致了这样的事情吗?

    编辑:解决方案

    诺布兹,我可以吻你。

    std::vector的大小在my.dll中发生了更改,原因是 _HAS_ITERATOR_DEBUGGING someone with the same problem ,并通过在我的项目顶部添加以下内容进行修复:

    // fix stack corruption errors caused by VS2008
    #define _HAS_ITERATOR_DEBUGGING 0
    #define _SECURE_SCL 0
    
    5 回复  |  直到 15 年前
        1
  •  22
  •   Hans Passant    15 年前

    你提到DLL。这也是相关的。迭代器调试可能会给您带来麻烦,您不能将关闭迭代器的代码与未关闭迭代器的代码混合使用。由于DLL可能是在没有它的情况下编译的,请尝试#define _HAS _ITERATOR _debuging0。

        2
  •  2
  •   Adam Liss    15 年前

    每当参数或局部变量意外更改时,很可能是由于堆栈损坏。每当使用未初始化的局部变量或将数据存储在分配给局部字符串或数组的内存之外时,就会发生这种情况。

    1. 将程序加载到调试器中。
    2. 在有问题的函数的第一行代码处插入断点。
    3. 执行程序,直到它到达断点。
    4. 对意外更改的变量设置监视。

    写入未分配(或分配错误)的内存时,将发生更改。写入的目标是有问题的变量。

        3
  •  0
  •   Community Erin Dees    7 年前

    发布的代码是正确的,您可以假设std::vector没有bug。在尽可能纯净的环境中复制异常(新的空白项目)。可能是什么蠢事吗 like this 在ComputeVertexCount()中?

        4
  •  0
  •   Henk    15 年前