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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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*.

+ 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, 18h48
  2. Probleme fonction sort d'unt list STL
    Par Brouzouf dans le forum Visual C++
    Réponses: 4
    Dernier message: 27/07/2006, 16h54
  3. Probleme de list STL et recherche
    Par flipper203 dans le forum SL & STL
    Réponses: 17
    Dernier message: 30/06/2006, 10h10
  4. un probleme de listing de dossier
    Par bidoo dans le forum Langage
    Réponses: 2
    Dernier message: 01/11/2005, 11h18
  5. Réponses: 8
    Dernier message: 02/04/2004, 17h31

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