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 :

[Debutant] déclaration de class et libération mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Par défaut [Debutant] déclaration de class et libération mémoire
    Bonjour, je suis en train d'apprendre le java et le c++.
    Pour ce dernier langage, le livre que je lis présente deux façons de créer des instance d'une classe:

    Employe dupond("Serge", "Dupond", 1972);

    ou bien:

    Employe *pdupond;
    pdupond = new Employe("Serge", "Dupond", 1972);
    ...
    ...
    delete pdupond;


    Par la suite le livre ne parle plus que de la deuxième méthode et il insiste beaucoup sur le fait que si on oubli le delete dans le programme, la mémoire occupé par dupond n'est pas libéré et ça peut poser des problème.

    Mais qu'en est-il de la première forme? Le problème de mémoire se pose-t-il aussi? Est-ce que je peux également utiliser le delete pour la libéré?

    Merci de ces précisions.

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    non !


    1 new => 1 delete
    2 new => 2 delete

    n new => n delete

    attention avec le delete pour les pointeur de tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete [] monpointeurdetableau;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Par défaut
    Pas de delete pour la première forme alors?

    Je n'ai donc pas de problème de mémoire en initialisant mes instances de cette façon:

    ma_classe mon_objet(attributs) ?


    J'entends dire qu'une des supériorité de java était son ramasse miettes qui évite le delete.
    Mais si je créé tout mes objets c++ comme ci-dessu, finalement les deux langages sont à égalité sur ce point non? Il y a quelque chose qui m'échappe?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Non rien ne t'échappe. Les objets alloués de la sorte en C++ sont détruits dès la sortie de la portée (la paire d'accolade) dans laquelle ils sont définis, ce qui permet de bien belles choses avec les constructeurs et destructeurs (voir le RAII).

    Ainsi en général les allocations dynamiques "brutes" se trouvent bien encapsulées dans des classes bas niveau auxquelles on ne touche plus.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    la difference importante entre les deux formes est que :

    - dans la forme 1 , l objet est alloue sur la pile ... donc a la sortie du bloc d accolades { ... } , l objet est automatiquement detruit (pas de delete donc)

    - avec la forme 2 , l objet est alloue dans le tas ... il faut donc le detruire manuellement avec un delete . Note que dans cette forme, le ppointeur pdupeond est alloue sur la pile, il sera detruit a la sortie du bloc, mais pas la zone memoire sur laquelle il pointe

    note : il existe des smart pointeurs (void auto_ptr et shared_ptr ... dans STL et boost) qui a leur destruction desalloue la memoire sur laquelle ils pointent

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Par défaut
    Ah d'accord j'y vois plus claire.

    Merci beaucoup

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

Discussions similaires

  1. [debutant nul] libération mémoire tableaux dynamiques
    Par hibiscuit dans le forum Débuter
    Réponses: 11
    Dernier message: 11/09/2007, 14h46
  2. Réponses: 2
    Dernier message: 08/03/2007, 10h23
  3. Réponses: 5
    Dernier message: 10/11/2004, 19h44
  4. [debutant][Classpath][Linux] Classe non trouvée
    Par oghma777 dans le forum Général Java
    Réponses: 5
    Dernier message: 15/10/2004, 21h26
  5. [Eclipse3.0][Debutant]Pas de .class généré
    Par willowII dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 10/08/2004, 17h07

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