当前位置:  开发笔记 > 编程语言 > 正文

C++参数的值在std :: vector中的堆栈帧之间发生变化

如何解决《C++参数的值在std::vector中的堆栈帧之间发生变化》经验,为你挑选了1个好方法。

我遇到了一个非常奇怪的错误,我希望有人可以解释.我有一个简单的std::vector,在哪里V3x是一个3d矢量(线性代数种类.)以下代码导致std::length_error抛出异常:

std::vector 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.我假设内存已经以某种方式损坏,但我不知道这是怎么回事.

对于更多的上下文,如果它是问题的一部分,这个代码位于我从Softimage XSI加载的.dll插件中.

有谁知道可能会导致这样的事情发生?

编辑:解决方案

nobugz,我可以吻你.

由于_HAS_ITERATOR_DEBUGGING在VS2008中,std :: vector的大小在我的.dll中发生了变化.搜索引导我找到有同样问题的人,并通过在项目顶部添加以下内容来修复:

// fix stack corruption errors caused by VS2008
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0

Hans Passant.. 21

值3435973836非常重要.在十六进制中,那是0xcccccccc.这是堆栈帧初始化代码在调试模式下分配给局部变量的值.当你在调试时看到它时,你会说"啊,变量未初始化".也许这会让你更接近解决这个问题.

你提到DLL.这也是相关的.迭代器调试可能会让您遇到麻烦,您不能将关闭它的代码与没有关闭的代码混合在一起.由于DLL可能在没有它的情况下编译,请尝试#define _HAS_ITERATOR_DEBUGGING 0.



1> Hans Passant..:

值3435973836非常重要.在十六进制中,那是0xcccccccc.这是堆栈帧初始化代码在调试模式下分配给局部变量的值.当你在调试时看到它时,你会说"啊,变量未初始化".也许这会让你更接近解决这个问题.

你提到DLL.这也是相关的.迭代器调试可能会让您遇到麻烦,您不能将关闭它的代码与没有关闭的代码混合在一起.由于DLL可能在没有它的情况下编译,请尝试#define _HAS_ITERATOR_DEBUGGING 0.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有