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 :

Delete et fuite de mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut Delete et fuite de mémoire
    Bonjour, j'ai appris que pour éviter les fuites de mémoire, il faut appelé delete pour chaque pointeurs alloué afin de libérer la mémoire.

    Mais supposons que dans un programme j'ai une classe client et que je créé chaque client dynamiquement à la demande de l'usagé au fur et à mesure et que je les places dans un vecteur.

    1) Vaut-il mieux que je créé un vecteur de pointeur Client ou bien un vecteur de Client ? Dans le cas des pointeurs de Client je devrais faire un delete sur chaque pointeurs du vecteur dans une boucle lors de la fermeture du programme.

    Mais dans le cas ou c'est un vecteur de client comment je libère la mémoire ?

    2) Étant donné que le libère la mémoire lorsque l'usagé choisis de quitter le programme, que se passe-t-il si il ferme le programme sans passer par la fonction quitter ? La mémoire ne sera pas libéré ou si windows fait ça tout seul ?

    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par AsmCode
    1) Vaut-il mieux que je créé un vecteur de pointeur Client ou bien un vecteur de Client ? Dans le cas des pointeurs de Client je devrais faire un delete sur chaque pointeurs du vecteur dans une boucle lors de la fermeture du programme.
    Si tu n'as pas besoin que la durée de vie de ton objet client soit supérieure à la portée dans laquelle il est déclaré et si tu n'as pas besoin de fonction virtuelles dans la classe client, le vecteur de pointeur ne présente pas vraiment d'intéret.

    Citation Envoyé par AsmCode
    Mais dans le cas ou c'est un vecteur de client comment je libère la mémoire ?
    Les opérations qui suppriment des éléments du vecteur appellent les destructeurs des objets contenus, donc tu n'as rien à faire, c'est automatique.

    Citation Envoyé par AsmCode
    2) Étant donné que le libère la mémoire lorsque l'usagé choisis de quitter le programme, que se passe-t-il si il ferme le programme sans passer par la fonction quitter ? La mémoire ne sera pas libéré ou si windows fait ça tout seul ?
    Toute la mémoire occuppée par un processus est libérée à la sortie de celui-ci.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut
    Ok

    Mais si mon vecteur est dans une routine ou une fonction, même si ce ne sont pas des pointeurs vers des objets clients, ce vecteur étant accessible ailleurs si je le passe en parametre ou si je le déclare global alors quelle est la différence si j'ai un vecteur de pointeurs ?

    Que se passe-t-il si j'efface un vecteur de pointeurs ? seul les pointeurs seront perdu et les emplacements mémoire des objets clients ne seront pas libérés ?

    Comment se fait-il qu'en faisant un delete sur un pointeur il apelle le desctructeur ? En fait qu'est-ce qui libère la mémoire ? Pas le destructeur, car il n'y a rien dedans et puis le pointeur n'est qu'une variable qui contient une adresse. C++ libère aussitôt la mémoire pointé et appelle le destructeur de l'objet (au cas ou) des trucs seraient à faire pour cet objet mais qui dans la plupart du temps ne fait rien ?

    De plus quelle est la différence entre delete et delete[] ? Dans quel contexte utiliser l'un ou l'autre ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par AsmCode
    Ok
    Mais si mon vecteur est dans une routine ou une fonction, même si ce ne sont pas des pointeurs vers des objets clients, ce vecteur étant accessible ailleurs si je le passe en parametre ou si je le déclare global alors quelle est la différence si j'ai un vecteur de pointeurs ?
    C'est plus propre pour l'allocation et la désallocation.

    Citation Envoyé par AsmCode
    Que se passe-t-il si j'efface un vecteur de pointeurs ? seul les pointeurs seront perdu et les emplacements mémoire des objets clients ne seront pas libérés ?
    Exactement. Les destructeurs des objets stockés sont appelés, et le destructeur d'un pointeur ne détruit pas l'objet pointé.

    Citation Envoyé par AsmCode
    Comment se fait-il qu'en faisant un delete sur un pointeur il apelle le desctructeur ?
    C'est la définition du comportement de delete

    Citation Envoyé par AsmCode
    En fait qu'est-ce qui libère la mémoire ? Pas le destructeur, car il n'y a rien dedans et puis le pointeur n'est qu'une variable qui contient une adresse. C++ libère aussitôt la mémoire pointé et appelle le destructeur de l'objet (au cas ou) des trucs seraient à faire pour cet objet mais qui dans la plupart du temps ne fait rien ?
    Lorsqu'un objet est détruit, son destructeur est appelé ainsi que le destructeur de chacun des membres.

    Citation Envoyé par AsmCode
    De plus quelle est la différence entre delete et delete[] ? Dans quel contexte utiliser l'un ou l'autre ?
    delete[] est à utiliser quand tu fais un new T[n] pour allouer un tableau, sinon delete.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut
    Ok je comprends mieux maintenant

    Par contre je me demandais l'utilité de faire un delete puisque le OS libère la mémoire de toute façon ? Car d'après ce que j'ai compris si l'usager ferme le programme de force en tuant le processus par exemple, alors le delete n'est pas fait puisque ce delete est applé lorsque l'usager appuie sur la touche pour quitter le programme dans le menu principal. Si le OS ne libère pas la mémoire tout seul alors il y a une fuite inévitable ?

    Aussi je me demandais quoique un peu HS pour ce topic, lorsqu'on fait

    string s;

    cin >> s;

    s peut-être de combien de long maximum ?

  6. #6
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Par contre je me demandais l'utilité de faire un delete puisque le OS libère la mémoire de toute façon ?

    Déjà d'un point de vue de la qualité de code, c'est obligatoire. Ensuite, rien ne dis que le système va libérer la mémoire. Enfin, il est courrant que dans les applications, la somme de la mémoire à allouer (pour tout le programme) dépasse la mémoire disponible, par conséquent si tu ne désalloue pas ce dont tu n'as plus besoin, tu vas faire planter le programme (au mieux tu vas le faire ralentir et tout le système avec).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string s;
     
    cin >> s;
     
    s peut-être de combien de long maximum ?
    A priori, je dirai la taille d'un size_t moins quelques bytes. En général ça va dépasser la capacité mémoire.

Discussions similaires

  1. new/delete/cast, fuite de mémoire ou pas ?
    Par boli_971 dans le forum C++
    Réponses: 7
    Dernier message: 18/04/2009, 13h40
  2. Réponses: 1
    Dernier message: 02/12/2005, 14h18
  3. fuite de mémoire
    Par mamag dans le forum MFC
    Réponses: 17
    Dernier message: 19/08/2005, 10h42
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 20h44
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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