-3
votes

Bonne façon de supprimer un élément dans STD :: Set

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 commentaires

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 et max_height_comp 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; ? Est-ce exact? Si tel est le cas, cela ne nécessite pas de pour boucle. L'élément max peut être obtenu avec std :: max_element et comparer contre max_height . Si oui, effacez cet itérateur.


3 Réponses :


0
votes

du Docs ici :

std :: set :: efface

supprime du conteneur défini un seul élément ou une gamme d'éléments ([premier, dernier)).

Cela réduit efficacement la taille du conteneur par le nombre d'éléments retirés, qui sont détruits.

Il semble que votre pointeur ne soit pas mis à jour pour une raison quelconque, et lorsque effacer () est appelé, il tente de détruire quelque chose qui n'a pas été attribué.


0 commentaires

1
votes

Vous n'apparaissez pas mettre à jour max_height_comp pour chaque itération. Après la première fois à travers le pendant la boucle , il conservera la valeur la plus importante de l'itération précédente, de sorte que it_max ne soit pas mis à jour et vous allons essayer d'effacer ce nœud une seconde fois. Vous devez réinitialiser max_height_comp au début de chaque boucle, à l'aide des données contenues dans en circulation ou un numéro inférieur à toute valeur possible que vous pourriez avoir.

Il y a aussi la possibilité que la valeur initiale de max_height_comple pourrait être plus grande que n'importe quel dans exceptionnel qui permettrait d'essayer d'effacer un itérateur construit par défaut.


0 commentaires

1
votes

Du code que vous avez montré, je pense que vous ne réinitialisez pas it_max ou max_height_comp entre les itérations de la boucle. Ainsi, sur la deuxième boucle, tout est inférieur à max_height_comp et it_max n'est jamais mis à jour.

Ce problème peut être entièrement évité à l'aide d'une fonction de < ALGORITHM> , de cette façon, les variables sont conservées dans la bonne portée par construction. xxx


3 commentaires

exceptionnel est un std :: set ... Il y a de meilleurs moyens d'obtenir l'élément max


Que diriez-vous - it_max = std :: prev (exceptionnel.end ()); ?


@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.