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 :

[C++] Surchage opérateur comportement bizarre


Sujet :

C++

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut [C++] Surchage opérateur comportement bizarre
    Bonsoir,

    Je rencontre un comportement bizarre lorsque je redéfinie les opérateurs new et delete. Voici mon code très simple :
    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
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <vector>
    #include <new>
     
    using namespace std;
     
    inline void* operator new(size_t size, char* filename, unsigned int line)
        throw (std::bad_alloc)
    {
        printf("operator new\n");
        return malloc(size);
    }
     
    inline void* operator new[](size_t size, char* filename, unsigned int line)
        throw (std::bad_alloc)
    {
        printf("operator new[]\n");
        return malloc(size);
    }
     
    inline void operator delete(void* m) throw()
    {
        printf("operator delete addr=%p\n", m);
        free(m);
    }
     
    inline void operator delete[](void* m) throw()
    {
        printf("operator delete[]\n");
        free(m);
    }
     
    inline void operator delete(void* m, char* filename, unsigned int line)
    {
        printf("operator delete with param\n");
    }
     
    inline void operator delete[](void* m, char* filename, unsigned int line)
    {
        printf("operator delete[]  with param\n");
    }
     
    #define new new(__FILE__, __LINE__)
     
    int main()
    {
        std::vector<int> vect;
        vect.push_back(5);
     
        cout << "Hello world!" << endl;
     
        return 0;
    }
     
    /*
        int* pt = new int();
        delete pt;
    */
    La sortie est :
    Hello world!
    operator delete addr=00651790
    Presque un Hello World ^^ avec un vector.

    Et justement, la ligne vect.push_back(5) provoque un appel à l'une de mes fonctions surchargées de l'opérateur Delete. Pourtant il n'y a pas de "new" correspondant pour l'adresse mémoire 0x00651790... Et vue que le but est de traquer les fuites de mémoires, cet appel n'est pas le bienvenue
    J'ai testé avec d'autres classes comme std::string et std::map, même soucis !

    Que ce passe t-il ?

    Merci beaucoup
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    C'est normal, l'implémentation (qui dépend du compilateur) de std::vector encapsule un tableau dynamique. De la même façon std::string encapsule un tableau dynamique de char.

    Edit: std::vector gère la mémoire pour toi tu n'as pas t'inquiéter de fuite mémoire de sa part (on espère). Tu peux peut-être utiliser valgrind pour ceci ?

  3. #3
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    C'est normal, l'implémentation (qui dépend du compilateur) de std::vector encapsule un tableau dynamique. De la même façon std::string encapsule un tableau dynamique de char.

    Edit: std::vector gère la mémoire pour toi tu n'as pas t'inquiéter de fuite mémoire de sa part (on espère). Tu peux peut-être utiliser valgrind pour ceci ?
    C'est bien ce que je me disais, du coup comment faire pour ne pas tracker les allocations/desallocation des std::vector & cie ? Et tracker uniquement les "new" et "delete" du programme principal ?

    Au fait, pourquoi n'ai je pas tracker le new du std::vector ?

    PS : Je connais Valgrind mais je veux créer un outil perso sous windows ^^
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonsoir,

    Les conteneurs de la bibliothèque standard utilise la notion d'allocateur, il est spécifié en dernier paramètre template des conteneurs. Si tu veux traquer les allocations au sein d'un conteneur, c'est par lui que tu devrais passer.

    Ton problème est que l'allocateur par défaut utilise ::new operator(std::size_t) et le delete qui correspond. Donc tu surcharges bien le delete mais pas le new. En effet ton define n'a aucune influence. Un define est un remplacement purement textuelle : il n'y a pas écrit "new" après le define, donc il n'est jamais remplacé (j'ignore le commentaire).

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    en fait c'est ta surcharge de delete qui n'est pas correcte.
    Tu dois créer un delete semblable à ton new, pour qu'il y soit associé (en gros)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void* operator new(unsigned int _uiBytes, const char* _szFilename, unsigned int _uiLine);
    void* operator new[](unsigned int _uiBytes, const char* _szFilename, unsigned int _uiLine);
    void operator delete(void* ptr, const char* _szFilename, unsigned int _uiLine);
    void operator delete[](void* ptr, const char* _szFilename, unsigned int _uiLine);
    Sinon, une exception de ton new ne fera pas appel au delete correspondant : il n'existe pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Bonjour,

    Merci beaucoup pour vos réponses !
    Effectivement, j'étais un peu fatigué et j'ai oublié des surcharges de new...
    J'ai même découvert l'existence du "placement new" en fouillant le header <new.h> de la lib

    Problème résolu
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

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

Discussions similaires

  1. Comportement bizarre de mes FPS
    Par Ekinoks dans le forum OpenGL
    Réponses: 7
    Dernier message: 22/08/2005, 15h14
  2. xsl:test .... avec comportement bizarre
    Par Blue LC dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/06/2005, 13h56
  3. [ACESS][MEMO][ISNULL]Comportement bizarre
    Par seb.49 dans le forum ASP
    Réponses: 2
    Dernier message: 09/06/2004, 10h44
  4. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 15h25
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 10h39

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