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 :

Echange pointeurs sur tableau delete ne fonctionne pas


Sujet :

C++

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Points : 54
    Points
    54
    Par défaut Echange pointeurs sur tableau delete ne fonctionne pas
    Bonjour,

    J'ai vraiment chercher des heures sans comprendre pourquoi j'ai ce problème:

    J'ai un code ci-dessous où j'alloue dynamiquement un tableau de 100*1024 entiers, ensuite j'ai un deuxième pointeurs ptr2 qui pointe à l'adresse du tableau précédement alloué avec ptr.

    Ensuite j'alloue une nouvelle zone mémoire avec ptr (donc ptr2 pointe bien l'ancienne zone). Mais lorsque j'appelle delete[] ptr2, rien n'est désallouer ?

    Quelqu'un saurait-il m'expliquer pourquoi.

    Merci

    Algernon


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int* ptr = new int[100 * 1024];
    // initialisation du tableau ptr
    int*ptr2 = ptr;
     
    ptr = new int[50 * 1024];
     
    delete [] ptr2; // Ici est le problème, pourquoi mon tableau n'est pas désallouer??

  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,

    Il faut comprendre qu'un pointeur n'est jamais qu'une variable numérique entière (généralement) non signée qui représente l'adresse mémoire à laquelle se trouve l'objet du type indiqué (ou, dans le cas présent, un espace mémoire suffisant pour représenter les x*1024 entiers).

    Ainsi, lorsque tu alloues l'espace pour 100*1024 entiers à la ligne 1, ptr correspond à l'adresse qui correspond à celle du premier des 102 400 entiers en question.

    Lorsque, à la ligne 4, tu déclares ptr2 et que tu l'initialise avec la valeur de ptr, tu as deux variables différentes qui sont tous deux des pointeurs vers des entiers, qui pointent tous les deux vers la même adresse mémoire.

    Mais à la ligne 6, ptr prend une autre valeur: celle de l'adresse mémoire du premier des 51 200 entiers pour lesquels tu demandes l'allocation dynamique.

    Tu te trouves donc dans une situation dans laquelle ptr (mettons 0xAABBCCDD) pointe vers une adresse alors que ptr2 pointe vers une autre adresse (mettons 0x11223344).

    Il est donc normal, lorsque tu appelle delete sur ptr2, que tu ne libères que l'espace mémoire qui commence en 0x11223344, sans toucher à celui qui commence en 0xAABBCCDD

    Si tu veux libérer la mémoire pour les deux tableaux, tu dois aussi invoquer delete pour ptr
    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
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Algernon2 Voir le message
    Mais lorsque j'appelle delete[] ptr2, rien n'est désallouer ?
    Qu'est-ce qui te fait dire que rien n'est désalloué ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Points : 54
    Points
    54
    Par défaut re
    Bonjour à vous deux et merci encore pour vos réponse,
    je suis entièrement d'acccord que ptr et ptr2 pointent deux espaces mémoire différent , ma question était que lorsque j'utilise sysinfo pour voir la quantité de ram libre avant et apres le delete [] ptr2, je m'attendais a voir augmenter la ram libre du nombre d'octet pointé par ptr2, mais non pas du tout?
    Du coup je doutais que delete [] ptr2 allais bien désallouer tout le bloc de 50 * 1024 entiers ? A mon sens oui, mais alors pourquoi la ram n'augmente pas de 50 * &024 * sizeof (int) octets ave sysinfo ?

    Peut etre c'est la taille du tas occupée que je devrais voir mais je ne sais pas comment faire ?

    Merci

    Algernon

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Points : 54
    Points
    54
    Par défaut re
    Euh, je voulais dire pourquoi avec sysinfo je ne vois pas apres le delete [] ptr2, que la ram libre augmente de 100*1024 * sizeof (int) octets je veux dire?

    Merci

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Généralement, les process utilisent plein de stratégies d'allocation mémoire bien complexes, qui font entre autre que quand du code relâche de la mémoire, le process va la garder quand même encre un peu, afin d'aller plus vite sur l'allocation mémoire qui va suivre, en la réutilisant.

    Et donc, ton outil qui mesure la mémoire allouée pour le process ne peut pas voir que la mémoire est redevenue disponible pour d'autres allocations dans le même process. D'où ma question sur l'outil de mesure utilisé pour dire que la mémoire reste non libérée...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Points : 54
    Points
    54
    Par défaut re
    bonjour,

    j'ai utilisé sysinfo et j'ai regardé le champ freeram, j'ai aussi essayé de lire directement le fichier /proc/mem à la ligne freeram et aussi le gestionnaire de mémoire d'ubuntu mais pareil la mémoire libre augmente que des quelques octet et pas des 100*1024*sizeof(int) espéré

    merci

  8. #8
    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
    Bonjour,

    la mémoire est bien libérée, aucun souci.
    Peu importe ce que tu vois ailleurs.
    Essaye donc d'accéder à la mémoire après le delete et tu auras un crash direct pour t'en assurer.
    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.

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu peux essayer un outil comme valgrind, en laissant le delete et en l'enlevant pour voir la différence.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Points : 54
    Points
    54
    Par défaut Re merci
    Merci pour cette confirmation et pour vos réponses

    A bientot
    Algernon

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

Discussions similaires

  1. Hover sur une image ne fonctionne pas
    Par adrix26 dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 08/08/2007, 17h54
  2. [Debutant] Pointeur sur tableau
    Par Pahcixam dans le forum Débuter
    Réponses: 7
    Dernier message: 25/05/2007, 21h19
  3. Delete ne fonctionne pas avec mon gridview
    Par NicoNGRI dans le forum ASP.NET
    Réponses: 2
    Dernier message: 26/10/2006, 08h52
  4. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  5. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48

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