J'ai rencontré un bug vraiment étrange, que j'espère que quelqu'un peut expliquer. Je simple std::vector<V3x>
, où V3x
est un vecteur 3d Le code suivant provoque une exception std::length_error
à être jeté (le genre d'algèbre linéaire.):Les changements de valeur du paramètre C++ entre les trames de pile dans std :: vector
std::vector<V3x> vertices;
int vertexCount = computeVertexCount();
vertices.resize(vertexCount); // throws std::length_error
J'ai vérifié que computeVertexCount()
retourne une valeur de 35
, qui est très loin en dessous de vector::max_size()
donc il n'y a aucun moyen de demander trop de mémoire.
J'ai tracé l'exception dans la définition de std::vector
, aux deux fonctions suivantes.
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
...
}
Ainsi, lorsque le paramètre _Count
est passé entre resize()
et _Insert_n()
, les changements de valeur de 35 à 3435973836. Je suppose la mémoire est en quelque sorte devenu corrompu, mais je ne sais pas comment cela pourrait être.
Pour un peu plus de contexte dans le cas où cela fait partie du problème, ce code se trouve dans un plugin .dll que je charge depuis Softimage XSI.
Est-ce que quelqu'un sait ce qui pourrait causer une telle situation?
EDIT: SOLUTION
nobugz, je pourrais vous embrasser.
La taille de std :: vector changeait dans mon fichier .dll, à cause de _HAS_ITERATOR_DEBUGGING
dans VS2008. La recherche m'a conduit à someone with the same problem, et il a été fixé en ajoutant ce qui suit au sommet de mon projet:
// fix stack corruption errors caused by VS2008
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0
est std :: vecteur sommets; vraiment une variable locale? sinon, il peut très bien ne pas être créé (à cause du fiasco d'initialisation statique) –
Est-ce que vertices.resize (vertexCount); besoin d'un deuxième argument? –