epl*_*ess 4 c++ memory debugging parameters vector
我遇到了一个非常奇怪的错误,我希望有人可以解释.我有一个简单的std::vector<V3x>,在哪里V3x是一个3d矢量(线性代数种类.)以下代码导致std::length_error抛出异常:
std::vector<V3x> vertices;
int vertexCount = computeVertexCount();
vertices.resize(vertexCount); // throws std::length_error
Run Code Online (Sandbox Code Playgroud)
我已经验证了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
...
}
Run Code Online (Sandbox Code Playgroud)
因此,当_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
Run Code Online (Sandbox Code Playgroud)
Han*_*ant 21
值3435973836非常重要.在十六进制中,那是0xcccccccc.这是堆栈帧初始化代码在调试模式下分配给局部变量的值.当你在调试时看到它时,你会说"啊,变量未初始化".也许这会让你更接近解决这个问题.
你提到DLL.这也是相关的.迭代器调试可能会让您遇到麻烦,您不能将关闭它的代码与没有关闭的代码混合在一起.由于DLL可能在没有它的情况下编译,请尝试#define _HAS_ITERATOR_DEBUGGING 0.
| 归档时间: |
|
| 查看次数: |
3080 次 |
| 最近记录: |