我遇到了一个非常奇怪的错误,我希望有人可以解释.我有一个简单的std::vector
,在哪里V3x
是一个3d矢量(线性代数种类.)以下代码导致std::length_error
抛出异常:
std::vectorvertices; 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.
值3435973836非常重要.在十六进制中,那是0xcccccccc.这是堆栈帧初始化代码在调试模式下分配给局部变量的值.当你在调试时看到它时,你会说"啊,变量未初始化".也许这会让你更接近解决这个问题.
你提到DLL.这也是相关的.迭代器调试可能会让您遇到麻烦,您不能将关闭它的代码与没有关闭的代码混合在一起.由于DLL可能在没有它的情况下编译,请尝试#define _HAS_ITERATOR_DEBUGGING 0.