AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  

 

 [C++] Problème avec delete

Aller en bas 
AuteurMessage
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 13:15

Hello \o/

Bon, voilà, j'ai un gros problème avec la fonction delete.

Tout mes events (comparable aux instances dans GM) sont enregistré dans un vector qui va exécuter les actions step/draw en boucle.
Pour créer un nouvel event, j'ai fait cette fonction :

Code:

  int spawn_event(int x,int y,string file)
{

      external_event * new_event=NULL;
      new_event = new external_event(x,y,file);
      new_event->create();
      return new_event->id;
}
Et le nouvel event s'enregistre tout seul dans la classe qui gère les actions des events (evlist.add(this))

Jusque là, pas de problème..

Maintenant, pour delete un event, j'utilise cette fonction (sur mon evlist) :

Code:

void event_list::destroy_event(unsigned int id)
{
  if (id<event_vector->size() && event_vector->at(id)!=NULL)
    delete event_vector->at(id);
    event_vector->at(id) = NULL;
}

Le delete marche bien, mais dès que je créé un nouvel event après avoir appelé un delete, le moteur crash, ce qui ne se produit pas si je ne met pas la ligne "delete event_vector->at(id)" (sachant qu'à chaque fois qu'une ligne est sur NULL, aucune fonction n'est appelée)

Ma fonction pour ajouteur un event (dans mon evlist) :

Code:

void event_list::add(event_class* new_event)
{
    new_event->id = event_vector->size();
    event_vector->push_back(new_event);
}

Voilà, c'est assez relou parce que du coups j'peux pas appeler les fonctions destructor, et je présume que ça peut foutre un ptit peu bordel dans la mémoire :/

Quelqu'un saurait d'où peut venir ce problème?

Merci zavous \o/

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_

Messages : 9142
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 13:22

A mon avis tu devrais utiliser des map a la place des vector.
Je vois pas trop d’où le problème viens (pas le temps de m'y pencher la dsl) mais je sais que j'ai déjà fait un système similaire, et j'utilisais pas de vector pour ça.

_________________
[C++] Problème avec delete Runningpotato1[C++] Problème avec delete TvF6GED [C++] Problème avec delete MdetltS
Revenir en haut Aller en bas
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 13:27

des maps ? C'est à dire ?

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_

Messages : 9142
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 13:34

Ben une map c'est une structure comme vector, mais dont l'utilisation est plus intéressante face a certaines situations.
Va faire un tour du coté de C++ référence tu verras.

_________________
[C++] Problème avec delete Runningpotato1[C++] Problème avec delete TvF6GED [C++] Problème avec delete MdetltS
Revenir en haut Aller en bas
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 13:41

Jvais voir ça, merci Smile

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
Gab666
Modérateur 'Zut'
Gab666

Messages : 5339
Localisation : **I move away from the mic to breathe in

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 16:05

onilink_ a écrit:
Ben une map c'est une structure comme vector, mais dont l'utilisation est plus intéressante face a certaines situations.
Va faire un tour du coté de C++ référence tu verras.

Ça semble plus être une queue qu'il a besoin. Un map, c'est ni plus ni moins que l'implémentation des tableaux associatifs en C++, donc je ne crois pas que ce soit la solution à son problème. Le seul changement que ça apporterait ça serait de pouvoir associer un event à une string plutôt qu'un id entier. Une queue, c'est le même principe qu'une stack mais en sens inverse(first in first out, plutôt que first in last out). C'est-à-dire qu'on a trois méthode importantes: push, pop(accompagné de peek dans le cas de la STL) et chacune de ces méthodes nous permet de gérer une liste d'éléments qui chaque fois qu'ils seront récupérés et gérés, disparaîtront de la liste.

Par contre, ce n'est pas son problème, est-ce que tu sais de quel type d'erreur qu'il s'agît (seg fault(NPE ou mauvaise adresse?), division par zéro, autre)? Je te conseille de le tourner en debug et vérifier surtout les accès mémoire à ce moment là.

Et en passant:

Code:
void event_list::destroy_event(unsigned int id)
{
  if (id<event_vector->size() && event_vector->at(id)!=NULL)
    delete event_vector->at(id);
    event_vector->at(id) = NULL;
}
Ton event_vector->at(id) = NULL; sera toujours exécuté vu que t'as pas de bracket dans ton if et vu ton indentation c'est probablement pas ce que tu veux. Ça peut (et va) causer problème si ta fonction est appelée sur un id qui n'est pas valide(<0 ou >=size.)

_________________
PIS MANIAC PREND DES BAINS !
Revenir en haut Aller en bas
http://www.dermanium-online.webou.net/
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 17:16

Bon, en fait rien à voir avec ça..

En gros, à la création d'un event,y'a sa liste de bone (string bone_name[255]) qui est initializé à "", et bizarrement ça fait crasher..

Vaudrait mieux utiliser un vector<string> ?

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_

Messages : 9142
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 17:20

Perso je préfère toujours utiliser les vector, quand au possibilités qu'il donnent.
Comme l'a dit Gab essaye de passer en debogage pour voir ce que ça donne.
(en plus si t'utilise code::blocks c'est très bien fichu).

_________________
[C++] Problème avec delete Runningpotato1[C++] Problème avec delete TvF6GED [C++] Problème avec delete MdetltS
Revenir en haut Aller en bas
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 17:28

J'arrive pas à me servir du debugeur Very Happy

Bon, j'ai changé ma liste de bone en vector<string>, ça fonctionne on dirait Very Happy

Par contre, si j'appelle bone_name->clear(), les strings seront quand même gardés en mémoire ?

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_

Messages : 9142
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 17:31

Je ne crois pas, clear efface tout dans le vector : http://www.cplusplus.com/reference/stl/vector/clear/

Sinon pour le débogage avec code::blocks j'ai un cours de TP normalement.
Je peut essayer de le retrouver et te le scanner si tu veux.

_________________
[C++] Problème avec delete Runningpotato1[C++] Problème avec delete TvF6GED [C++] Problème avec delete MdetltS
Revenir en haut Aller en bas
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 17:34

Donc si j'ai un vector de structure qui elle-même contient un vector, un simple clear sur ce vector permettra de dégager les autres ?

Yep, à la rigueur si ça ne te dérange pas, merci ! gnii

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
Gab666
Modérateur 'Zut'
Gab666

Messages : 5339
Localisation : **I move away from the mic to breathe in

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 17:39

onilink_ a écrit:
Je ne crois pas, clear efface tout dans le vector : http://www.cplusplus.com/reference/stl/vector/clear/

Sinon pour le débogage avec code::blocks j'ai un cours de TP normalement.
Je peut essayer de le retrouver et te le scanner si tu veux.

Bah si tu travailles avec des objets alloués dynamiquement, il ne gérera pas la destruction des objets à la fin.

_________________
PIS MANIAC PREND DES BAINS !
Revenir en haut Aller en bas
http://www.dermanium-online.webou.net/
onilink_
Modérateur
onilink_

Messages : 9142
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 17:40

Ouai c'est sur, mais avec des std::string pas de soucis.

Dès que je retrouve mon TP je le poste Termite.

_________________
[C++] Problème avec delete Runningpotato1[C++] Problème avec delete TvF6GED [C++] Problème avec delete MdetltS
Revenir en haut Aller en bas
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyVen 24 Juin 2011 - 19:19

Gab666 a écrit:
onilink_ a écrit:
Je ne crois pas, clear efface tout dans le vector : http://www.cplusplus.com/reference/stl/vector/clear/

Sinon pour le débogage avec code::blocks j'ai un cours de TP normalement.
Je peut essayer de le retrouver et te le scanner si tu veux.

Bah si tu travailles avec des objets alloués dynamiquement, il ne gérera pas la destruction des objets à la fin.
Oki, merci Very Happy

Merci à toi oni gnii

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyDim 26 Juin 2011 - 16:01

Bon, le problème persiste et j'pense que c'est les vectors qui foutent bordel, jvais tâter les maps.

En gros, faudrait faire un truc du style

Code:

typedef map<unsigned int, event_class> event_list;


le unsigned int serait alors l'id de mon event (qui ne doit pas changer), et le second l'objet sur lequel il envoi, c'est ça ?

Mais après, comment je peux parcourir toute ma map ? faudrait forcément utiliser un iterator ?

Merci d'votre aide gnii

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_

Messages : 9142
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyDim 26 Juin 2011 - 16:14

Oui le int te donne l'id de l'event.
Et oui tu doit utiliser un iterator s'il faut tout parcourir, a moins que tes id soient dans l'ordre et se suivent.

Sur C++ reference y a pas mal d'exemples, je te conseille d'y faire un tour.
D'ailleurs peut être qu'en jetant un oeil sur les autres containers tu trouveras plus adapté a ton problème.

_________________
[C++] Problème avec delete Runningpotato1[C++] Problème avec delete TvF6GED [C++] Problème avec delete MdetltS
Revenir en haut Aller en bas
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyDim 26 Juin 2011 - 16:52

onilink_ a écrit:
Oui le int te donne l'id de l'event.
Et oui tu doit utiliser un iterator s'il faut tout parcourir, a moins que tes id soient dans l'ordre et se suivent.

Sur C++ reference y a pas mal d'exemples, je te conseille d'y faire un tour.
D'ailleurs peut être qu'en jetant un oeil sur les autres containers tu trouveras plus adapté a ton problème.
Yep, je zieute C++ ref depuis taleur :d

Ben les IDs sont sensé se suivre, jusqu'à ce qu'un event se fasse supprimer, donc ça peut donner un truc du style :

map[0]=object0
map[1]=object1
map[78]=object78

Mais c'est assez bizarre cette map, parcequ'on peut accéder à genre map["blabla"]..
ça marche comment dans la mémoire ? C'est pas un peu lent comme processus ?

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_

Messages : 9142
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyDim 26 Juin 2011 - 17:15

Citation :
map::operator[]
Complexity:Logarithmic in size.
C'est donc plutôt rapide.

_________________
[C++] Problème avec delete Runningpotato1[C++] Problème avec delete TvF6GED [C++] Problème avec delete MdetltS
Revenir en haut Aller en bas
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyDim 26 Juin 2011 - 18:11

Bon, j'ai changé mon système pour me servir des map, mais c'est encore pire Very Happy

Hmm, l'usage abusif de dynamic_cast peut provoquer des problèmes ?
Apparemment ça coince sur une fonction qui s'appelle get_event(id) qui renvoi l'object à la position id dans ma map, mais ça renvoit une class "event_class", alors qu'en général on est sensé manipulé une classe enfant (external_event), d'où le dynamic_cast..

edit : J'ai réussi à faire marcher le debuggeur, voilà l'erreur :

Program received signal SIGSEGV, Segmentation fault.
In luaD_growstack () (E:\WINDOWS\system32\lua5.1.dll)

edit² : Apparemment, c'est parce que j'appelle la fonction lua_close() lors du destructor de mon external_event, mais faut forcément l'appeler pour libérer le bordel de lua, non ?

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
Gab666
Modérateur 'Zut'
Gab666

Messages : 5339
Localisation : **I move away from the mic to breathe in

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyMar 28 Juin 2011 - 0:12

Bon tout d'abord pour tout ce qui concerne utiliser des maps pour ce qu'il veut faire. Comme je l'ai dit, assurez-vous que c'est vraiment la structure de données appropriée, car je suis à peu près certain que map est pas la bonne dans n'importe quel cas pour gérer des événements, pour ce que vous essayez de faire, essayez plutôt une queue. N'oubliez surtout pas que même si la complexité d'un map pour une recherche est logarithmique, celle pour une insertion et une suppression l'est aussi. En plus que vous utilisez une structure pas approprié du tout pour itérer à l'intérieur sans rien d'autre, à votre place je regarderais plutôt pour un queue qui se vide à mesure qu'on la consulte qui se rempli toujours vers la fin chaque fois qu'on ajoute un element.

Termite a écrit:
Bon, j'ai changé mon système pour me servir des map, mais c'est encore pire Very Happy

Hmm, l'usage abusif de dynamic_cast peut provoquer des problèmes ?
Apparemment ça coince sur une fonction qui s'appelle get_event(id) qui renvoi l'object à la position id dans ma map, mais ça renvoit une class "event_class", alors qu'en général on est sensé manipulé une classe enfant (external_event), d'où le dynamic_cast..

edit : J'ai réussi à faire marcher le debuggeur, voilà l'erreur :

Program received signal SIGSEGV, Segmentation fault.
In luaD_growstack () (E:\WINDOWS\system32\lua5.1.dll)

edit² : Apparemment, c'est parce que j'appelle la fonction lua_close() lors du destructor de mon external_event, mais faut forcément l'appeler pour libérer le bordel de lua, non ?
T'es sûr que c'est un event_class? Regarde dans la mémoire pour être sûr. Ensuite regardes si quelque part tu castes pas accidentellement en event_class, parce que si quelque part tu castes la valeur en event_class, tu viens de perdre toute la section enfant plus ton polymorphisme.

Apparament que c'est dans la DLL de lua que se produit la segfault, donc je te conseilles:
* fais pas à pas ton exécution depuis où tu commences à libérer des ressources et si c'est impossible, log tous ce que tu libères pour être sûr que tu ne libères pas la même ressource deux fois
* vérifie à quelle ligne se produit ton erreur
* jete un coup d'oeil à ton call stack, on sait jamais ce qu'il peut se produire si tu réécris par dessus accidentellement
* fais toi un programme de test qui va faire EXACTEMENT ce que le tiens fais (par rapport à lua je parle), mais sans le reste autour
* si après cela t'as pas trouvé de solution penses à poster ton code

_________________
PIS MANIAC PREND DES BAINS !
Revenir en haut Aller en bas
http://www.dermanium-online.webou.net/
Termite
Utilisateur confirmé: Rang ****
Termite

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete EmptyDim 3 Juil 2011 - 18:19

Y'a pas de ressource libéré lorsqu'un event est supprimé, tous les sprites/sons/animations, etc sont détruit lorsqu'il y a changement de map uniquement (les events ne peuvent manipuler que des IDs)

J'pense qu'il faudrait que je réécrive un peu tout ça, mélanger des objects manipulé par lua et des objects manipulé en C++, je pense que j'ai simplement réussi à foutre un sacré bordel triste2

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
Contenu sponsorisé




[C++] Problème avec delete Empty
MessageSujet: Re: [C++] Problème avec delete   [C++] Problème avec delete Empty

Revenir en haut Aller en bas
 
[C++] Problème avec delete
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Programmation-
Sauter vers: