J'ai une classe de graphique
malloc: *** error for object 0x7fc485c02de0: pointer being freed was not allocated malloc: *** set a breakpoint in malloc_error_break to debug
3 Réponses :
du Docs ici : P>
std :: set :: efface strong> p>
supprime du conteneur défini un seul élément ou une gamme d'éléments ([premier, dernier)). P>
Cela réduit efficacement la taille du conteneur par le nombre d'éléments retirés, qui sont détruits. P> blockQuote>
Il semble que votre pointeur ne soit pas mis à jour pour une raison quelconque, et lorsque
effacer () code> est appelé, il tente de détruire quelque chose qui n'a pas été attribué. P>
Vous n'apparaissez pas mettre à jour Il y a aussi la possibilité que la valeur initiale de max_height_comp code> pour chaque itération. Après la première fois à travers le
pendant la boucle code>, il conservera la valeur la plus importante de l'itération précédente, de sorte que
it_max code> ne soit pas mis à jour et vous allons essayer d'effacer ce nœud une seconde fois. Vous devez réinitialiser
max_height_comp code> au début de chaque boucle, à l'aide des données contenues dans
en circulation code> ou un numéro inférieur à toute valeur possible que vous pourriez avoir. P>
max_height_comple code> pourrait être plus grande que n'importe quel dans
exceptionnel code> qui permettrait d'essayer d'effacer un itérateur construit par défaut. P>
Du code que vous avez montré, je pense que vous ne réinitialisez pas Ce problème peut être entièrement évité à l'aide d'une fonction de it_max code> ou
max_height_comp code> entre les itérations de la boucle. Ainsi, sur la deuxième boucle, tout est inférieur à
max_height_comp code> et
it_max code> n'est jamais mis à jour.
< ALGORITHM> CODE>, de cette façon, les variables sont conservées dans la bonne portée par construction. p>
exceptionnel code> est un
std :: set code> ... Il y a de meilleurs moyens d'obtenir l'élément max
Que diriez-vous - it_max = std :: prev (exceptionnel.end ()); code>?
@Paulmckenzie qui ne fonctionnera pas car l'ensemble est commandé par adresse et non à la hauteur. En outre, l'ensemble n'a pas pu être commandé par la hauteur sans perdre des éléments qui ont la même hauteur que l'autre.
Je soupçonne que vous effacez un itérateur au même noeud deux fois. Pouvez-vous montrer le code où vous initialisez
it_max code> et
max_height_comp code> entre efface?
@Peterbell merci pour le commentaire. J'ai édité le post.
Alors brisons cela. Toute votre boucle fait effacer l'élément maximum de l'ensemble supérieur ou égal à
(* (g.vertices.begin ())) -> max_height; code>? Est-ce exact? Si tel est le cas, cela ne nécessite pas de
pour code> boucle. L'élément max peut être obtenu avec
std :: max_element code> et comparer contre
max_height code>. Si oui, effacez cet itérateur.