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 :

new/delete/cast, fuite de mémoire ou pas ?


Sujet :

C++

  1. #1
    boli_971
    Invité(e)
    Par défaut new/delete/cast, fuite de mémoire ou pas ?
    Salut,

    Une question me trotte dans la tête depuis quelques temps, alors je viens vous demander votre avis.
    Premièrement voici un exemple de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void *ptr = new int[10];
     
        std::cout << "taille en int* " << 10 * sizeof(int) << std::endl;
        std::cout << "taille en char* " << 10 * sizeof(char) << std::endl;
     
        delete[] static_cast<char*>(ptr);
    Je me demande alors, est-ce que ce code provoque une fuite de mémoire ?
    Sachant que dans mon cas un int est sur 4 octets, et un char est sur un octet.
    Je pense que c'est le cas mais je n'en suis pas sûr et c'est bien pour cela que je vous demande votre avis .

    Je sais void* c'est mal, mais c'est juste pour illuster le problème .

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    *Normalement*, non... (à vérifier)

    Ceci dit, comme tu l'as fait remarquer, void*, c'est mal... En C++, on préférera les template (la programmation générique)

    Et puis, s'il y a bien un cas sur lequel je ne ferai jamais de transtypage, c'est bien le cas de delete / delete[]...

    Typiquement, un transtypage, quel qu'il soit (et ici, ce serait plutôt un reinterpret_cast, sauf erreur ), ca a pour but de permettre de faire passer quelque chose pour quelque chose d'autre: un pointeur du type de la classe de base pour un pointeur du type de la classe dérivée réelle (static_cast et dynamic_cast), une variable constante pour une variable non constante (const_cast) ou n'importe quoi pour n'importe quoi d'autre (reinterpret_cast) car tu as besoin... de l'"autre chose"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Je pense que c'est un comportement indéfini.

    Suivant la manière d'allouer, ça va leaker, ou pas.

    Si l'allocateur stocke la taille du tableau en nombre d'éléments, ça va merder. S'il la stocke en taille mémoire, ça va marcher.

    Avec malloc/free, ce serait sûr que ça marche (ie, ne leake pas). Avec new/delete, il y a de grandes chances que ça marche, mais ça n'est pas garanti.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par la norme 3.7.3 §2
    The library provides default definitions for the global allocation and deallocation functions. Some global allocation and deallocation functions are replaceable (18.4.1). A C + + program shall provide at most one definition of a replaceable allocation or deallocation function. Any such function definition replaces the default version provided in the library (17.4.3.4). The following allocation and deallocation functions (18.4) are implicitly declared in global scope in each translation unit of a program
    void* operator new(std::size_t) throw(std::bad_alloc);
    void* operator new[](std::size_t) throw(std::bad_alloc);
    void operator delete(void*) throw();
    void operator delete[](void*) throw();
    Comme tu peux le voir, le parametre de delete / delete[] est... void*...

    Tu as donc, de toutes manières, après appel du destructeur (qui n'existe pas en tant que tel sur les types primitifs) conversion en void* pour la libération de la mémoire...

    Le comportement peut donc être indéfini si tu essaye avec des types non primitifs (appel du mauvait destructeur ou pas d'appel du tout), mais pas avec les types primitifs
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    boli_971
    Invité(e)
    Par défaut
    Merci beaucoup à vous, me voila maintenant rassuré sur ce point

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par boli_971 Voir le message
    Merci beaucoup à vous, me voila maintenant rassuré sur ce point
    Attention, nous sommes bien d'accord sur le fait que, si tu utilise autre chose que des types primitifs, ca va partir en vrille, car le destructeur adéquat ne sera pas appelé...

    C'est bien clair dans ta tête
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    boli_971
    Invité(e)
    Par défaut
    Ok je prend note, vu que j'avais l' intention d' appliquer cela uniquement sur des types primitifs ce n' est pas un problème. Merci

  8. #8
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Change
    delete[] static_cast<char*>(ptr);
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete[] static_cast<int*>(ptr);
    et plus de comportement indéfini.

    Si tu ne traites qu'avec des PODs, tu ferais mieux d'utiliser directement operator new/operator delete, ce qui te permettra d'éviter le comportement indéfini.
    Boost ftw

Discussions similaires

  1. new anonyme et fuite mémoire
    Par Darz4 dans le forum Langage
    Réponses: 4
    Dernier message: 20/12/2012, 23h28
  2. Réponses: 15
    Dernier message: 04/11/2008, 02h10
  3. Fuite mémoire ou pas fuite mémoire?
    Par barbsbou dans le forum Débuter
    Réponses: 8
    Dernier message: 10/03/2008, 14h15
  4. Delete et fuite de mémoire
    Par AsmCode dans le forum C++
    Réponses: 7
    Dernier message: 18/02/2007, 21h22
  5. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40

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