Я столкнулся с действительно странной ошибкой, которую, надеюсь, кто-нибудь сможет объяснить. У меня есть простой std::vector<V3x>, где V3x - трехмерный вектор (тип линейной алгебры). Следующий код вызывает исключение std::length_error:
std::vector<V3x> 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. Я предполагаю, что память каким-то образом была повреждена, но я понятия не имею, как это могло быть.
В качестве дополнительного контекста на случай, если это часть проблемы, этот код находится в подключаемом модуле .dll, который я загружаю из Softimage XSI.
Кто-нибудь знает, что может вызвать подобное?
РЕДАКТИРОВАТЬ: РЕШЕНИЕ
nobugz, я мог бы поцеловать тебя.
Размер std :: vector менялся внутри моей .dll из-за _HAS_ITERATOR_DEBUGGING в VS2008. Поиск привел меня к кто-то с такой же проблемой, и она была исправлена добавлением следующего в начало моего проекта:
// fix stack corruption errors caused by VS2008
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0