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

SL & STL C++ Discussion :

Probleme de liste STL


Sujet :

SL & STL C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut Probleme de liste STL
    Bonjour,
    j'utilise une liste STL pour stocker les addresses des pointeurs alloues dynamiquement pour ensuite les libérer. Voici ma fonction de desallocation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void HDF5_Free_Memory()
    {
    	list<void*>::iterator iter;
     
    	for(iter = list_Dyn_Alloc.begin() ; iter != list_Dyn_Alloc.end(); iter++ )
    	{
    		delete (*(iter._Ptr))._Myval;
    	}
    	list_Dyn_Alloc.clear();
    }
    Mes allocations sont toutes faites avec "new".

    En mode debug, cette fonction marche tres bien, mais en mode release, voici l erreur que me donne Visual studio 8:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    error C2248: 'std::list<_Ty>::_Const_iterator<_Secure_validation>::_Ptr' : cannot access protected member declared in class 'std::list<_Ty>::_Const_iterator<_Secure_validation>'
            with
            [
                _Ty=void *,
                _Secure_validation=true
            ]
            D:\Studio2005\VC\include\list(316) : see declaration of 'std::list<_Ty>::_Const_iterator<_Secure_validation>::_Ptr'
            with
            [
                _Ty=void *,
                _Secure_validation=true
            ]
    Je ne comprend pas pourquoi je peux acceder a _Ptr en mode debuge et pas en mode release.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    En mode debug, les structures de données sont parfois différentes du mode release. De manière générale, ne pas s'appuyer sur des membres commençant pas _, c'est pas standard, on ne sait pas si ça existe partout.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    ok, mais alors comment faire pour acceder a l addresse que j ai mis dans la liste. Voici comment ca se passe:

    ma liste est de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list<void*> list_Dyn_Alloc;
    voici comment j ajoute l addresse de l element allour dynamiquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str_buffer = new char[(str_buffer_str->size() + 1)* sizeof(char)];
    list_Dyn_Alloc.push_back(str_buffer);
    coment donc acceder ensuite a l addresse de cet element via la STL

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    quand tu récupères un élément de la liste, c'est un void*, pourquoi prendre son adresse ?? c'est ça qu'on doit envoyer au delete - en fait, c'est même pas vrai, il faudrait le transformer en un type de données -

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    si je fais un delete de iter, ce n est pas la memoire allouee que je vais desallouer mais l element de la liste chainee non?

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Un iter, tu ne peux pas le delete puisqu'il est alloué sur la pile. Un *iter, c'est ton pointeur en question que tu veux effacer.
    Mais comme dit, tu fais un new quelque chose pour allouer cette mémoire, là, il voudra appeler le destructeur, mais il n'y en a pas pour un void*, donc tu vas avoir des soucis.
    Vive les void*.

  7. #7
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ca doit être la pire des manières pour accéder à ce qui est pointé par un itérateur.
    Ecris plus simplement :
    Ensuite, pour détruire un objet mieux vaut connaître son type... Sinon boom.

    Les void* c'est crade, tu veux faire quoi au juste ?

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    bah en fait dans mon programme, j alloue de la memoire de type different, et je veux ensuite la desallouer, d'ou le void*

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par flipper203
    bah en fait dans mon programme, j alloue de la memoire de type different, et je veux ensuite la desallouer, d'ou le void*
    C'est une liste de quoi que tu as ?

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    ma liste contient les addresses des allocation dynamiques

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Allocations dynamiques de quoi ?

  12. #12
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    de tableaux de char, double, int, enfin de plusieur type

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par flipper203
    de tableaux de char, double, int, enfin de plusieur type
    Dans ce cas peut-être en utilisant un objet encapsulant les différents types de pointeurs supportés (sous forme d'union par ex), avec un flag permettant de stocker le type alloué et un destructeur chargé de libérer la mémoire allouée avec le bon type; ce qui fait que tout serait désalloué automatiquement lorsque la liste est détruite.

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    -> boost::any

  15. #15
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par flipper203
    ma liste contient les addresses des allocation dynamiques
    Citation Envoyé par flipper203
    de tableaux de char, double, int, enfin de plusieur type
    Je ne veux même pas savoir ce que tu essayes de faire avec ça

    Si c'était un genre de gestionnaire de mémoire qui ne conservait les adresses mémoire que pour de la vérification ou du logging OK, mais compter sur ce tableau de void* pour détruire les variables allouées, c'est cradingue...

  16. #16
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par flipper203
    de tableaux de char, double, int, enfin de plusieur type

    tu veux faire un langage interprété ?

  17. #17
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    Je vais essayer d expliquer plus en détail....donc, en fait, j ai des fonctions qui prennent en parametre un buffer de string ou de double (en fonction de la fonction):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int HDF5_Read_Attr_str(const char* file_Name, const char* dataset_Name, const char* attr_Name, char* &str_buffer);
     
    int HDF5_Read_Data(const char* file_Name, const char* dataset_Name, double* &dble_buffer);
    Dans ces fonctions, j alloue dynamiquement la memoire de ces buffers. Je ne peux donc pas la desallouer dans la fonction, car la fonction appelante utilise ce buffer pour recuperer les donnees. C'est pour ca que j ai mls en place la liste chainee de void* pour recuperer les addresses a desallouer a la fin de l execution de mon programme. Je ne vois pas comment je peux faire autrement si ce n est d avoir deux liste chainees, une de chaque type (double et string).

    Avez vous des propositions?

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Tu peux soit gérer 2 listes de char* et double*, soit gérer une seule liste d'une structure/classe agrégeant les 2 types.

    La seconde solution présentant l'avantage de pouvoir insérer un code de désallocation automatique des buffers dans le destructeur (appelé à la destruction de la liste), évitant ansi les problèmes potentiels de fuites.

  19. #19
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu ne peux pas simplement utiliser des trucs un peu plus intelligents que des pointeurs bruts (std::vector, std::string, boost:: xxx_ptr, ...) ?

    Sinon oui, avoir deux listes sera une bien meilleure option. Ce n'est pas comme si tu avais à gérer 50 types différents.

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

Discussions similaires

  1. probleme conteneur <list> de la bibliotheque STL
    Par khaledmoez dans le forum C++
    Réponses: 2
    Dernier message: 06/12/2009, 19h48
  2. Probleme fonction sort d'unt list STL
    Par Brouzouf dans le forum Visual C++
    Réponses: 4
    Dernier message: 27/07/2006, 17h54
  3. Probleme de list STL et recherche
    Par flipper203 dans le forum SL & STL
    Réponses: 17
    Dernier message: 30/06/2006, 11h10
  4. un probleme de listing de dossier
    Par bidoo dans le forum Langage
    Réponses: 2
    Dernier message: 01/11/2005, 12h18
  5. Réponses: 8
    Dernier message: 02/04/2004, 18h31

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