本当に奇妙なバグに遭遇しました。誰かが説明してくれることを願っています。は単純なstd::vector<V3x>
で、V3x
は 3 次元ベクトル (線形代数のようなもの) です。次のコードにより、std::length_error
例外がスローされます。
std::vector<V3x> vertices;
int vertexCount = computeVertexCount();
vertices.resize(vertexCount); // throws std::length_error
computeVertexCount()
が の値を返すことを確認しましたが35
、これははるかに低いvector::max_size()
ため、大量のメモリを要求している可能性はありません。
例外を の定義std::vector
から次の 2 つの関数までたどりました。
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、私はあなたにキスすることができました。
VS2008のため、.dll 内で std::vector のサイズが変化してい_HAS_ITERATOR_DEBUGGING
ました。検索により、同じ問題を抱えている人が見つかり、プロジェクトの上部に次を追加することで修正されました。
// fix stack corruption errors caused by VS2008
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0