IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Appels au destructeur


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Appels au destructeur
    Bonjour,

    un petit problème super pénible que je comprends pas :
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    int main (int argc, char *argv[])
    {
    	SDL_Surface *ecran = NULL;
    	SDL_Event event;
    	bool continuer = 1;
    	SDL_Init(SDL_INIT_VIDEO);
    	ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE| SDL_DOUBLEBUF);
    
    	//SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));
    	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 112));
    	Carte carte(ecran);
    	//carte.AfficherGrille();
    	carte.ShowObstacle();
    	SDL_Flip(ecran);
    	if (SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL) == 0)
    		cout << "ok" << endl;
    	else
    	{
    		cout << "echec" << endl;
    	}
    	SDL_Rect s;
    	s.x = 100;
    	s.y = 100;
    //######PARTIE QUI NOUS(?) INTERESSE#########
    		Tile t("Fond/Objets/Tile/tileTest/tileTest", s);
    //######PARTIE QUI NOUS(?) INTERESSE#########"
    	while (continuer)
    	{
    		SDL_WaitEvent(&event); /* On utilise PollEvent et non WaitEvent pour ne pas bloquer le programme */
    		switch (event.type)
    		{
    			case SDL_QUIT:
    				continuer = 0;
    				break;
    			case SDL_KEYDOWN:
    				switch (event.key.keysym.sym)
    				{
    					case SDLK_a:
    						cout << "appel" << endl;
    						carte.Rafraichir(SDL_GetTicks());
    						cout << "rafraicih ok" << endl;
    						SDL_Flip(ecran);
    						break;
    
    					case SDLK_b:
    						SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 112));
    						SDL_Flip(ecran);
    						break;
    
    					case SDLK_c:
    						carte.AfficherGrille();
    						SDL_Flip(ecran);
    						break;
    
    					case SDLK_d:
    					{
    						cout << "appel ajouterTile" << endl;
    						carte.ShowObstacle();
    						if (carte.AjouterTile(t)) cout << "Tile Ajoute" << endl;
    						SDL_Flip(ecran);
    					}
    						break;
    					default:
    						break;
    				}
    				break;
    			default:
    				break;
    		}
    
    		//SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    		//SDL_Flip(ecran);
    	}
    	//SDL_FreeSurface(t.vImageAnim[0]);
    	//SDL_FreeSurface(t.vImageAnim[1]);
    	//SDL_FreeSurface(t.vImageAnim[2]);
    //########### ICI AUSSI ##########
    	cout << "sortie du bloc" << endl;
    	SDL_FreeSurface(ecran);
    	cout << "sortie du bloc" << endl;
    	SDL_Quit();
    	cout << "sortie du bloc" << endl;
    //###############################
    	return EXIT_SUCCESS;
    }
    et le destructeur de notre Tile t :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Tile::~Tile ( )
    {
    	if (!desalloc)
    	{
    		cout<<"appel au destructeur de Tile"<<endl;
    		for (unsigned int i = 0; i < vImageAnim.size(); i++)
    		{
    			SDL_FreeSurface(vImageAnim[i]);//ATTENTION A LA SEGFAULT!!!!
    		}
    		desalloc=true;
    	}else
    	{
    		cout<<"appel mais aucune suppression"<<endl;
    	}
    } //----- Fin de ~Tile
    Le problème, c'est que dans ma classe Tile, j'ai des SDL_Surface* autrement dit des zones mémoires à désallouer. Aussi jme suis dit de mettre ca dans le destructeur.
    MAIS : dans la console, j'ai (en partie) cela qui s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sortie du bloc
    sortie du bloc
    sortie du bloc
    appel au destructeur de Tile
    appel au destructeur de Tile
    *** glibc detected *** /home/kikoolollmddrr/workspace/RPG/Debug/RPG: double free or corruption (!prev): 0x088aa680 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7
    Donc je comprends pas pourquoi il y a double appel du destructeur de de mon instance t.
    Je suis aussi passé par pointeur, a savoir Tile* t=new Tile("Fond/Objets/Tile/tileTest/tileTest", s);
    puis un delete(t), mais idem, j'ai deux appels.

    Voila pour le principal problème.
    Un deuxième problème(plutot question en fait), c'est pouquoi dans le second appel au destructeur de mon instance t, la valeur de desalloc est prise a 0 et pas 1. Pourquoi 0 en particulier?

    PS : j'ai enlevé les include, et ai laissé le code SDL. en parlant de code SDL, j'ai choisi de poster ici, car le problème que j'ai c'est coté destructeur.

    (d'accord coté SDL j'en ai pas mal aussi...)
    Merci d'avance


    D'ailleurs, avec du recul du post, je me rend compte que j'utilise SDL_FreeSurface apres SDL_Quit se qui me parait (deja) suspect(car aucune erreur rouge (ou alors elle est masquée dans l'hexadécimal qui ne me parle pas trop...)).
    Dernière modification par Invité ; 19/02/2009 à 00h00.

  2. #2
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Salut,
    A prendre avec des pincettes, mais lorsque tu fais:
    "carte.AjouterTile(t)"
    un object Tile temporaire est construit (il me semble), sauf si tu passe ton objet par reference à la fonction. Il s'agit peut être de l'appel du destructeur de cette objet temporaire, à la fin de ta fonction "AjouterTile". Essayes (si c'est pas déjà le cas) de modifier le prototype de ta fonction "AjouterTile" en:
    void AjouterTile(Tile & t);
    pour voir si ca corrige le probleme.

  3. #3
    Invité
    Invité(e)
    Par défaut
    exact Vikki!!
    En effet, je fais un push_back(Tile) (de <vector>) (dans la methode Ajouter de carte).
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. appeler le destructeur dans une fonction
    Par asoka13 dans le forum C++
    Réponses: 3
    Dernier message: 12/05/2008, 00h24
  2. [POO] Appel des destructeurs
    Par Merfolk dans le forum Langage
    Réponses: 2
    Dernier message: 28/03/2008, 17h59
  3. Réponses: 3
    Dernier message: 31/07/2007, 21h18
  4. [Loufoque] Appel de destructeur
    Par Chii-san dans le forum C++
    Réponses: 12
    Dernier message: 18/05/2006, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo