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