2012-01-11 2 views
1

Ou du moins, je pense que le problème implique une erreur de mémoire. Je fais un programme en SFML et je travaille actuellement sur les menus en utilisant une classe d'interface graphique que j'ai créée juste pour SFML. En interne, la classe GUI utilise std :: shared_ptr pour gérer tous ses pointeurs internes. Le programme se bloque systématiquement après les sorties main() et tous les destructeurs globaux ont été appelés, et gdb dit qu'un point de rupture a été déclenché dans ntdll! WaitForAlpCompletion, ce qui me porte à croire que le problème est une corruption de mémoire. Chaque fois que je supprime l'instanciation de l'interface graphique de la fonction de menu, il se ferme et se ferme sans erreur. Cela semble indiquer que l'interface utilisateur graphique est la cause de l'incident, sauf que les sous-menus qui créent et détruisent leurs propres instances d'interface graphique peuvent être appelés et quittés sans incident ni point d'arrêt.Localisation d'erreurs de mémoire dans une interface graphique C++

Certains psuedocode:

SubMenu 
{ 
    Create GUI 
     Do Menu 
    Destroy GUI 
} 

Menu 
{ 
    Create GUI 
     Do Menu?SubMenu 
    Destroy GUI 
} 

main 
{ 
    Init Stuff 
    Menu 
    UnInit Stuff 
    Destroy GUI 
    return 0 
} 

//after return 
Global Dtors 
Breakpoint triggered??? 

Je suis à une perte de ce que cela pourrait être. J'ai l'intention d'utiliser un débogueur de mémoire comme valgrind un jour, mais je me demandais si quelqu'un d'autre avait des idées sur ce que cela pourrait être.

+1

Je doute que ce soit votre * design * qui pose problème. –

Répondre

0

Une corruption de tas peut être causée par ce code:

int main() 
{ 
    int *A(new(std::nothrow) int(10)); 
    int *B(A); 

    delete B; 
    delete A; 
} 

Est-ce que tout votre code contient cette situation semblable?

+1

Merci pour votre aide ... –

2

Enfin compris !!!!! Il s'avère que std :: map appelle les destructeurs de ses objets chaque fois qu'il est redimensionné, ce qui oblige shared_ptr à supprimer plusieurs fois leurs données. Quelques changements de conception "rapide" et corrigés :) Merci les gars! Pourquoi ne voyons-nous seulement que le pseudo-code?

Questions connexes