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 :

Delete et erreur "non alloué"


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut Delete et erreur "non alloué"
    Bonsoir à tous,

    J'ai un comportement assez étrange avec delete, c'est pourquoi je me tourne vers vous ce soir ; en effet, je possède une classe contenant une variable membre de type pointeur, que j'alloue dynamiquement. (m_machin = new Machin() )Dans le destructeur de la classe en question, je détruis cette objet avec un simple delete m_machin ; j'ai en effet pu lire ici et là que delete s'occupait de vérifier l'existence du pointeur. Seulement, quand je fais simplement un delete m_machin, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    malloc: *** error for object 0x2: pointer being freed was not allocated
    *** set a breakpoint in malloc_error_break to debug
    Pourtant, mon objet a bien été alloué dynamiquement, j'ai fais des tests.. En remplaçant par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (m_machin)
      delete m_machin
    Ça marche mieux, ce qui semble logique ; mais je ne comprends pas pourquoi mon objet a été désalloué _avant_ que je ne fasse l'appel au delete ? Je précise que ma classe ne fait rien d'autre, c'est juste une classe de test toute vide là. ^^

    Si vous avez une idée du pourquoi du comment !

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 243
    Points : 415
    Points
    415
    Par défaut
    j'ai en effet pu lire ici et là que delete s'occupait de vérifier l'existence du pointeur.
    Il vérifie seulement si il est différent de NULL, exactement comme tu le fais toi même.

    Envois le code, on ne sait jamais.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Points : 120
    Points
    120
    Par défaut
    Salut

    j'ai deux pistes pour toi :

    - si le pointeur n'est pas initialisé à null lors de la construction : si tu ne passe pas par le new, à la destruction ça peut planter

    - est ce que tu interdis la génération du copy constructor et de l'opérateur =
    si tu ne le fais pas et que le compilateur le génère pour toi, alors ta classe ayant un pointeur, ce dernier sera partagé entre les copies et il sera 'deleted' autant de fois, et au deuxième delete ça plantera, ça arrive typiquement quand tu utilise un std::vector<TaClasse>

    Cdt

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 61
    Points : 56
    Points
    56
    Par défaut
    En fait, ma classe héritait d'une RenderWindow de la SFML, et je pense que c'est ça qui posait problème ; au moment de l'appel à les objets dynamiques devaient probablement être déjà détruits, ou quelque chose du genre.
    Maintenant que ce n'est plus un héritage direct, pas de soucis.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/01/2007, 20h36

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