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 :

surdefinition operateur new et delete


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 24
    Par défaut surdefinition operateur new et delete
    Bonjour à tous
    Comme mon titre l'indique je souhaite effectuer une surdefinition des operateurs new/delete afin de pouvoir logger les eventuelles fuites de memoires. Mon travail se base sur le 1er tutorial du moteur 3d Yes::Engine de Laurent Gomila (1000 Mercis pour ce super tutorial).
    Donc dans mon travail j'utilise les surdefinitions ecrites dans le Yes::Engine ainsi que le meme "MemoryManager".
    Tout fonctionne tres bien jusqu'à l'utilisation d'un delete... seg fault...
    exemple d'un programme tout simple mais qui ne fonctionne pas avec le log des allocations/liberations memoire :
    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
     
    #define _DEBUG
    #include "DebugNew.h"
     
     
    int main(int argc, char **argv)
    {
        int i =0; //variable bidon
        i++;      //code bidon
     
        int *test = new int(); //reservation memoire
     
        i++;     //code bidon
        i = 5;  //code bidon
     
        *test = 5 + i;  
     
        delete test;    //liberation
    }
    Voila donc le code ci dessus ne fonctionne pas. En mode pas à pas il plante sur le new... (Le log du "memory manager" est vide)
    Etrangement si j'enleve le "delete test;" le code fonctionne Mais bien sur fuite de memoire... (elle est meme logguée dans le rapport des fuites).
    Bien sur le code fonctionne si j'enleve #define _DEBUG

    J'utilise Dev cpp 4.9.9.2 avec gcc 3.4.2

    Donc si quelqu'un aurait une piste je suis preneur merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    De toutes manières, je suis personnellement pas fan du tout de ce truc.
    Déjà pour deboguer je préfère utiliser des outils faits pour ça qui de toutes façons seront bien plus puissants que des opérateurs surchargés et en plus ce truc fait l'allocation avec malloc, a priori moins performant que l'allocateur de base.

    Enfin bref Laurent devrait passer, il te dira sûrement où se situe le problème.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    J'avais eu le même problème, de mémoire il faut instancier le MemoryManager une première fois (via un appelle à la méthode Instance, me semble que c'est un singleton) avant de commencer à allouer quoi que ce soit.

  4. #4
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Ca compile bien chez moi.

    As-tu fais des manipulations particulières avec les classes du tutorial ?

    Ou est-ce que tu réutilise mot pour mot les fichiers de surcharge d'opérateur, de Singleton, de Memorymanager et de CFile ?

    Si tu as fais des copier/coller dans ton unique fichier DebugNew.h, as tu bien fait attention de où tu plaçais tes macros ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 24
    Par défaut
    Tout d'abord merci pour vos réponses.

    J'avais eu le même problème, de mémoire il faut instancier le MemoryManager une première fois (via un appelle à la méthode Instance, me semble que c'est un singleton) avant de commencer à allouer quoi que ce soit.
    Oui en effet MemoryManager est un singleton. Appeler la methode instance() avant ne change rien a mon probleme

    Ca compile bien chez moi.
    As-tu fais des manipulations particulières avec les classes du tutorial ?
    Ou est-ce que tu réutilise mot pour mot les fichiers de surcharge d'opérateur, de Singleton, de Memorymanager et de CFile ?
    Si tu as fais des copier/coller dans ton unique fichier DebugNew.h, as tu bien fait attention de où tu plaçais tes macros ?
    Au debut j'ai essayé de creer ma propre surdef. et memory manager mais sans succes. Du coup jai ecris ce petit programe test en utilisant exactement les sources du yes::Engine (DebugNew.h, File.h/.cpp, MemoryManager.h/.cpp) La classe n'est pas construite a partir de CSingleton.

  6. #6
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Citation Envoyé par johjoh
    La classe n'est pas construite a partir de CSingleton.
    En effet, désolé pour la confusion.

    Citation Envoyé par johjoh
    Du coup jai ecris ce petit programe test en utilisant exactement les sources du yes::Engine (DebugNew.h, File.h/.cpp, MemoryManager.h/.cpp)
    Je suppose que tu as supprime tous les YES_EXPORT et tous les #include export.h ?

    Par ailleurs, tu ne devrait pas définir le _DEBUG dans ton main.cpp, mais bien dans tes directives de compilations, car actuellement il n'est pas définit au moment où tu compile par exemple MemoryManager.cpp et File.cpp

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 24
    Par défaut
    oui en effet j'ai bien supprimé les YES_EXPORT... et le export.h
    et pour ce qui est de la directive du compilateur, je viens de tester à l'instant mais sans succes
    Ce que je trouve bizarre, c'est le fait que le programme "marche" si je ne fais pas de delete et que si j'en fais un il plante sur le new (seg fault) alors que je n'ai rien modifié (juste commenter le delete), logiquement si mon delete était incorrect ca devrait planter sur mon delete non?

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

Discussions similaires

  1. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  2. intrigue sur la surcharge du new et delete
    Par swirtel dans le forum C++
    Réponses: 12
    Dernier message: 07/09/2006, 15h23
  3. Operateur "new" renvoi NULL
    Par Demerzel_01 dans le forum C++
    Réponses: 25
    Dernier message: 07/07/2006, 09h43
  4. Allocation Dynamique de Memoire Avec Operateur New
    Par msstaf dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/06/2006, 15h49
  5. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 00h29

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