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 :

Désalocation mémoire


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut Désalocation mémoire
    Salut à tous,

    Juste un petit doute que j'aimerais éclaircir... Lorsqu'on utilise un pointeur (en particulier pour les chaines de caractères), on doit désalouer la mémoire utilisée, un fois le pointeur inutile. Mais quand on utilise des "string", doit-on désalouer quelque chose, ou cela est il fait automatiquement?

    Je suppose qu'il n'y a rien à faire, mais j'aimerais avoir confirmation

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    C'est tout l'intérêt. Non seulement c'est automatique, mais en plus même si il y a une exception, la libération aura toujours lieu en fin de portée. Même combat pour les autres conteneurs de la SL.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    J'en profite pour poser une question plus spécifique, sur le même sujet:

    j'ai une classe construite comme ceci :

    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
    class FichierIni
    {
    	protected:
    		struct Parametre
    		{
    			bool commentaire;
    			std::string nom;
    			std::string valeur;
    			Parametre *suivant;
    		};
    		struct Section {
    			bool comment;
    			std::string nom;
    			Parametre *premierParametre;
    			Section *suivant;
    		};
    		Section *debutFichier;
    		Section *maSection;
    		Parametre *monParametre;
     
    	public:
    		FichierIni(void);
    		~FichierIni(void);
    }
    Pour le destructeur, voici mon code :

    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
    FichierIni::~FichierIni(void)
    {
    	while (debutFichier!=NULL)
    	{
    		maSection = debutFichier->suivant;
    		while (debutFichier->premierParametre!=NULL)
    		{
    			monParametre = debutFichier->premierParametre->suivant;
    			delete debutFichier->premierParametre->suivant;
    			debutFichier->premierParametre=monParametre;
    		}
    		delete debutFichier->suivant;
    		debutFichier = maSection;
    	}
    }
    Ai-je bien fait? J'ai un peu de mal avec la désallocation (il faut dire, ma formation sur l'utilisation du C++ est lointaine lol...). En fait, ce ne sont que de simples listes chainées...

    Autre petite question : en C++, ma solution tient-elle la route? (je parle bien sûr de l'utilisation des listes chainées dans ce cas de figure)

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Ce me parait compliqué. À vue de nez tu m'as l'air d'avoir les bons réflexes, mais là il est trop tard pour que j'investigue sérieusement le code. Il faut dire que je ne suis pas un amateur des listes intrusives, et encore moins de l'utilisation d'un curseur "courant" dans la liste. Ce qui est déjà bien, c'est l'encapsulation (dans le contexte de la définition d'une liste).

    Mais tout refaire est généralement de la perte de temps -- dans le cadre de la réalisation d'un programme qui a une tâche à accomplir. Le C++ te fournir en standard une classe std::list, profites-en plutôt.

    Après dans le genre "se concentrer sur la tâche à réaliser et ne pas réinventer la roue", je vais plus loin et utilise boost.program_option pour gérer les paramètres d'un programme. On le fait une fois pour voir, après on passe à autre chose. Du moins en ce qui me concerne.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Disons que j'aime créer mes fonctions, pour ne pas avoir 15 librairies à inclure, ou encore ne pas avoir d'exe trop volumineux, à cause de tas de "grosses" librairies, que je n'utilise qu'à 1% :p

    Et en plus, ca me permet d'apprendre (c'est avant tout le but du programme que je fais :p)

    Par contre, il faut reconnaitre que mon code est très probablement moins optimisé que celui trouvé dans les librairies (eh oui, j'ai beau avoir fait des études en programmation, je n'ai qu'un bac+2, et je n'ai jamais travaillé "professionnellement" avec ce langage ;p.... Bref, mon niveau en C++ est : "scolaire rouillé" lol).

    Je vais m'intéresser au type list, que je ne connaissais pas :p J'espère que je saurais faire ce que je veux avec Je te tiens au courant :p

    Merci de ton aide, en tous les cas

  6. #6
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Bon, j'ai regardé le type "list", mais j'ai quand même un soucis...

    En effet, il est vrai que faire une liste de Section semble sympa, chaque section contenant une liste de paramètre. J'obtient donc cette classe :

    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
    lass FichierIni
    {
    	protected:
    		struct Parametre
    		{
    			bool comment;
    			std::string nom;
    			std::string valeur;
    		};
    		struct Section {
    			bool comment;
    			std::string nom;
    			std::list<Parametre> listeParametre;
    		};
    		std::list<Parametre> listeSection;
     
    	public:
    		FichierIni(void);
    		~FichierIni(void);
    }
    Mais mon soucis vient un peu après... Si je veux par exemple chercher la valeur d'un paramètre, dans une section donnée. Je comptais créer une fonction "int lireInt (string Section, string Parametre)". Mais si j'utilise la fonction std::find, je dois lui passer en paramètre la section à rechercher, par exemple... Or, je n'ai que le nom de ma section, pas le reste des éléments constituant le type Section.

    Je ne sais sais pas si je suis très clair... Pour faire plus simple, comment faire pour rechercher par exemple, la valeur du paramètre "port", de la section "[serveur]"? Avec mes pointeurs, je vois bien comment faire, mais avec des listes... ;S Utiliser un iterator parcourant ma liste, et vérifiant à chaque fois le nom de l'élément courant?


    PS: petite confirmation: en utilisant les listes et les itérators, plus besoin de désalouer quoi que ce soit?

    PS2: j'ai survolé la documentation de Boost.Program_options, mais visiblement cela permetterait à un utilisateur de configurer ses options via les lignes de commandes... Or, mon but serait plutot de créer un fichier .ini, et d'y stocker tous les paramètres, puis de les charger au lancement de l'application, et de pouvoir modifier via un menu (qui remettrait à jour le fichier .ini, bien entendu)... Enfin, je me suis peut être trompé, je n'ai que jeté un coup d'oeil :p

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    std::map (qui est une table associative) serait plus adaptée ici ; sinon il faudrait définir un foncteur pour chercher sur le nom seulement (FAQ!)

    "PS:" oui tout à fait

    "PPS:" je ne sais pas où il en sont avec les fichiers ini (je me contente généralement des bons vieux .rc dénués de toute section), mais normalement, cela permet aussi de gérer des fichiers de configuration. La doc me semble mal fichue du coup, -> fonction (non documentée ?) parse_config_file
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Oui oui, je te promet, je ne passe pas une journée sans lire la FAQ C++, qui m'apprend beaucoup de choses très utiles (comme la gestion des exceptions, ou les vectors, que je n'avais pas vu en cours)... Mais il faut le reconnaitre, il y a encore des choses (comme les foncteurs, et certains conteneurs) que je ne connais pas encore :p

    Justement, pour le type map, je venais de lire un post d'un autre personne, où on expliquait que le type map permettait d'avoir de bonnes performances, car il classait automatiquement les données par ordre croissant, selon la 1e variable (en gros), et en effet, je n'ai pas besoin de garder l'ordre des rubriques... Et si cela permet d'avoir de meilleures performances.... C'est le bien venu

    Je vais me re-re-re-...-documenter, merci beaucoup pour ton aide précieuse

  9. #9
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Bon, j'ai bien avancé avec les maps. J'ai un peu de mal à les utiliser, mais ca m'a l'air assez sympa (même si quelques trucs m'échappent encore).

    J'ai une dernière question : j'aimerais partager mon humble code avec la communauté, afin qu'il puisse servir à des débutants, que ce soit pour l'utiliser ou juste s'en inspirer, et en meme temps pour me permettre de recueillir des commentaires, afin de l'optimiser/corriger.

    Serait-ce utile, et si oui, cela est-il possible sur ce site, et si oui, où serait sa meilleure place (me dites pas à la poubelle, SVP :p)?

    Le but de mon code est de pouvoir lire les fichiers textes (enfin là dessus, il n'y a que le minimum), et surtout les fichiers .ini (avec différentes sections, et différents paramètres dans les section)

  10. #10
    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
    Par défaut
    Utiliser un iterator parcourant ma liste, et vérifiant à chaque fois le nom de l'élément courant?
    Oui, tu peux faire ça.
    C'est d'ailleurs ce que fait std::find je suppose.

Discussions similaires

  1. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  2. Accéder à un espace mémoire sous XP
    Par keny dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 02/08/2002, 12h37
  3. Déterminer l'adresse d'une application en mémoire
    Par Gib dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 11/06/2002, 14h27
  4. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 20h20
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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