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 :

[operator delete] Surcharge non appelée ... presque résolu


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut [operator delete] Surcharge non appelée ... presque résolu
    Bonjour,

    Voici une présentation brève de mon programme :
    - j'utilise la librairie Qt
    - je compile sous linux avec g++.
    - j'ai un programme principal, limité à la fonction main.
    - et 3 librairies dynamiques dont une déclare dans un .h une surcharge de l'opérateur delete comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void operator delete(void *inPointer)
    {
         ...
    }
    Elle déclare également une surcharge de new.

    Mon problème est le suivant :
    - si delete n'est pas utilisé dans main(), mon opérateur delete n'est jamais appelé dans le reste du programme alors que le .h en question est correctement inclu partout. Par contre, mon opérateur new est correctement appelé de partout.
    - par contre si j'utilise delete au moins une fois dans la fonction main(), alors non seulement c'est mon delete qui est appelé mais en plus, il sera alors appelé partout ailleurs dans mon programme ! Mon opérateur new est également appelé, comme dans le premier cas.

    Voici rapidement les pistes que j'ai explorées :
    - essai de tous les prototypes possibles pour delete
    - recherche d'une surcharge de delete dans les sources de Qt, des fois qu'il y en ait une qui écrase la mienne, je n'en ai pas trouvé.
    - j'ai créé un petit programme équivalent mais limité au strict minimum (plus de Qt, juste une fonction main et une librairie dynamique) et le problème n'y apparaît pas.

    Ce qui m'épate, c'est le comportement qui diffère suivant que j'utilise ou non delete dans main(). J'insiste sur le fait que lors de mon test, hormis ces deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double *temp = new double;
    delete temp;
    que je rajoute dans main(), je ne change pas une virgule au reste du code.

    Là, je sèche, avez-vous d'autres idées ?

    Merci d'avance !

  2. #2
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    J'ai eu un problème un peu similaire avec Borland. Après maints essais, j'en étais arrivé à la conclusion que le compilateur surcharge également l'opérateur delete pour ses besoins propres (sans doute CodeGuard dans Borland). La solution était d'inclure le .h en dernier de la liste des #include.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    Mouairf, ça n'a pas l'air d'être le même problème ici. En tout cas, ça n'explique pas pourquoi le fait d'utiliser ou non delete dans main() change le comportement de delete dans tout le programme.

    Ton problème se manifestait comment ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Points : 68
    Points
    68
    Par défaut
    J'ai trouvé hier soir ce qui semble créer le problème : lors de l'édition de liens, je linkais mes librairies et l'exécutable avec (entre autres) les librairies de Qt ainsi que d'autres librairies dont notamment la librairie GLU de Mesa (option -lGLU pour gcc)
    J'ai modifié les options du link pour ne plus linker qu'avec les librairies de Qt. Depuis, c'est bien mon operateur delete qui est appelé.

    Ce que je comprends c'est que la librairie libQtOpenGL est déjà liée à la librairie GLU, il n'est donc pas nécessaire que je linke mon exécutable avec libQtOpenGL et libGLU.
    Ce que je ne comprends pas, c'est pourquoi le fait de rajouter l'option -lGLU lors du link me crée ces effets bizarres. Après tout, je ne vois pas ce qui gêne dans le fait de linker avec un truc qui n'est pas nécessaire. Le linker devrait se débrouiller non ?

    Surtout, ce que je me demande c'est "Est-ce que le problème est réellement résolu ?". J'espère n'avoir pas juste supprimé les symptômes par coïncidence et les voir réapparaître plus tard.

    Pas plus d'idées ?

Discussions similaires

  1. surcharge ostream - non appelé
    Par FoX_*D i E* dans le forum C++
    Réponses: 5
    Dernier message: 06/04/2009, 22h54
  2. classe Action non appelée
    Par jc44 dans le forum Struts 1
    Réponses: 4
    Dernier message: 18/08/2006, 14h22
  3. [presque résolu]Probléme liste déroulante
    Par jojo57 dans le forum Access
    Réponses: 5
    Dernier message: 21/04/2006, 11h57
  4. onkeyup non appellé
    Par GregPeck dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/02/2006, 17h22
  5. Verifier formulaire - fonction non appelée
    Par nerick dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/12/2005, 17h44

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