Je reçois ce message d'erreur:
L'assertion de débogage a échoué! P>
Expression: _block_type_us_valid (pHead-> nblockuse) p> blockquote>
Tout en essayant de faire ce qui suit p>
xxx pré> "L'erreur semble être liée à la fonction de tri. Je vérifie toutes les instances du vecteur des filets et ils semblent être d'accord, avoir des SSE différents. La chose amusante est que j'ai créé un cas plus simple du code ci-dessus (voir ci-dessous) et fonctionnait sans aucune erreur. Je détruit mon cerveau. S'il vous plaît aider. P>
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; class Student { public: string name; double grade; Student(string,double); bool operator < (const Student &st) const {return grade < st.grade;} }; Student::Student(string stName,double stGrade) { name = stName; grade = stGrade; } int main() { vector<Student> group; Student *st; st = new Student("Bill",3.5); group.push_back(*st); st = new Student("John",3.9); group.push_back(*st); st = new Student("Dave",3.1); group.push_back(*st); sort(group.begin(),group.end()); for each(Student st in group) cout << st.name << " " << st.grade << endl; cin.get(); return(0); }
5 Réponses :
L'assertion _block_type_is_valid est tirée, lorsque vous écrasez l'en-tête d'un bloc attribué par Vous devez consulter votre code complet et essayer de travailler à partir des données que vous avez dans votre débogueur. Cet extrait de code court contient plusieurs usages «curieux» de C ++, mais pas de point évident auquel cela produit l'erreur décrite (au moins pour moi). P> Nouveau code>. Cela se produit lorsque vous coupez des objets, utilisez des objets morts, etc. p>
Merci tout le monde. Tout d'abord, je dégage la mémoire allouée pour les filets vecteur à l'intérieur du destructeur pop par Le message d'erreur ne dit pas grand chose et j'apprécierais si quelqu'un me montre comment faire de MSVC 2008 pour montrer plus Informations détaillées. Voici ce qu'il dit (je ne peux pas couper et la coller pour une raison quelconque, alors je le reporte): p> Quand j'appuie sur débogage, le compilateur me montre la ligne 52 de fichier dbgdel.cpp: p> intérieur p> Opérateur vide Suppr (vide * pUSERDATA) P> Voici un plus de Mon code montrant ce qui se passe avant que j'essaie de trier p> tout fonctionne correctement jusqu'au point de tri (). Le pointeur LSZ est utilisé à l'intérieur de NN pour contenir le nombre de nœuds de chaque couche du réseau neuronal, par exemple LSZ [3] = {12,5,1} (12 entrées, une couche cachée avec 5 neurones et une sortie). Il est utilisé pour créer un tableau 3D des poids pour chaque connexion du réseau. Chaque réseau NN (il y en a 100) à l'intérieur de la population a son propre réseau de poids. Mais ils partagent le même LSZ [] et d'autres paramètres structurels, qui sont malheureusement copiés d'une autre instance NN à l'autre. Je voulais utiliser static pour déclarer ces membres de la classe partagée, mais cela empêcherait la parallélisation. P> p>
Je viens de découvrir que si je fais une construction pop comme celle-ci , tout fonctionne, y compris le tri (). Mais cela ne fonctionne pas pour moi parce que maintenant le vecteur des filets contient le même exemple de NN Poppsize Times. L'idée était de supporter chacun de ces instances individuellement. Chaque instance de NN est supposée avoir son propre réseau de poids, initialisée au hasard à l'intérieur du constructeur NN: P>
de mon expérience - ce type d'erreur pourrait être causé par la corruption du tas. Alors .. Vous devez d'abord vérifier les fuites de mémoire. Si vous utilisez Visual Studio Utilisez _crtCheckMemory (). P>
Parfois, c'est parce que vous avez une chaîne de longueur x et que vous avez accidentellement mis un mot plus long, c'est ce qui s'est passé dans mon cas. P>
Cela devrait être un commentaire, pas une réponse
Votre code a une tonne de fuites de mémoire. Vous appelez nouveau NN, puis ajoutez l'objet au vecteur - L'objet est copié dans le vecteur et l'objet d'origine reste sur le tas et vous ne le supprimez pas. C'est une fuite de mémoire mais ce n'est pas probablement la cause du problème.
Est-ce que cela répond à votre question? Pourquoi est-ce que je reçois _crtisvalidheappointer (bloc) et / ou is_block_type_valid (en-tête -> _ block_use) assertions?