首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::向量中堆栈帧间C++参数的变化

std::向量中堆栈帧间C++参数的变化
EN

Stack Overflow用户
提问于 2009-01-11 17:38:42
回答 5查看 3.3K关注 0票数 4

我碰到了一个很奇怪的虫子,我希望有人能解释。我有一个简单的std::vector<V3x>,其中V3x是一个三维向量(线性代数类)。以下代码将引发std::length_error异常:

代码语言:javascript
运行
复制
std::vector<V3x> vertices;
int vertexCount = computeVertexCount();
vertices.resize(vertexCount); // throws std::length_error

我已经验证了computeVertexCount()返回一个35的值,这个值远低于vector::max_size(),所以它不可能要求太多的内存。

我将异常追溯到std::vector的定义中,包括以下两个函数。

代码语言:javascript
运行
复制
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加载的一个.dll插件中。

有人知道什么会导致这种事发生吗?

编辑:解决方案

nobugz我可以吻你。

由于.dll中的_HAS_ITERATOR_DEBUGGING,std::载体的大小在改变。搜索使我找到了有同样问题的人,并且通过在我的项目顶部添加以下内容来修复它:

代码语言:javascript
运行
复制
// fix stack corruption errors caused by VS2008
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-01-11 18:43:54

值3435973836是显着的。在六角,那是0xcccccccc。这是由堆栈帧初始化代码在调试模式下分配给局部变量的值。当您在调试时看到它时,您会说“啊,变量没有初始化”。也许这能让你更接近解决这个问题。

你提到了DLL。这也是相关的。Iterator调试可能会给您带来麻烦,您不能将关闭它的代码与不关闭的代码混合使用。因为DLL可能是在没有它的情况下编译的,所以请尝试#定义_HAS_ITERATOR_DEBUGGING 0。

票数 22
EN

Stack Overflow用户

发布于 2009-01-11 18:26:34

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

调试这一点的简单方法是:

  1. 将程序加载到调试器中。
  2. 在违规函数的第一行代码处插入断点。
  3. 执行程序,直到它到达断点。
  4. 对意外更改的变量设置一个手表。
  5. 逐步执行该函数,直到发生意外更改。

当写入未分配(或错误分配)内存时,将发生此更改。写入的目标是违规变量。

票数 2
EN

Stack Overflow用户

发布于 2009-01-11 17:55:05

发布的代码是正确的,您可以假设std::vector没有bug。在最纯粹的可能环境中复制异常(新的空白项目)。会不会是像这样中的ComputeVertexCount()中的一些愚蠢的东西?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/433274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档