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 :

manipulation de std::vector probleme memoire


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Par défaut manipulation de std::vector probleme memoire
    Bonjour a tous!

    Je suis confronte a de serieux problemes avec la manipulation des std::vector en c++ avec Visual .Net 2003. J' ai developpe un algorithme qui doit gerer des listes d objets assez complexes j utilise donc des vector pour les stocker.

    Jusque la pas trop de probleme mais par la suite j ai tente d integrer mon algorithme a un autre projet que j ai adapte et les methodes communiquent par le biais de std::vector< std::vector<int> > de maniere iterative. Mais mon programme fini par s arreter pour cause de probleme de memoire de ce type:

    Microsoft C++ exception: std::bad_alloc @ 0x0012ecac.
    Y a t-il un probleme connu avec le fait d envoyer d envoyer en parametres des pointeurs sur des std::vector et de retourner des objets de type std::vector par le biais de methodes d'objet ou de methode statique.

    Voici un exemple de code contenue dans une methode appele de facon iterative:

    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
            std::vector<int> mvRef;
    	int num4x4Blocks = width/4*height/4;
    	blocks4x4.reserve(num4x4Blocks);
    	mvRef.reserve(2*num4x4Blocks);
     
            //
            //
            // Insertion des valeurs dans mvRef a l'aide de differentes
            // methodes
            //
            //
     
     
            return mvRef;    // Ceci cree une erreur de type memory a la 2 eme
                                  // iteration
    Notez qu'il suffit de modifier un bout de code pour que l erreur apparaissent dans une autre methode qui a le meme genre de procede



    Toutes vos suggestions sont les bienvenues...

  2. #2
    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
    Que vaut num4x4Blocks avant le plantage ?

  3. #3
    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 angediablo

    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
            std::vector<int> mvRef;
    	int num4x4Blocks = width/4*height/4;
    	blocks4x4.reserve(num4x4Blocks);
    	mvRef.reserve(2*num4x4Blocks);
     
            //
            //
            // Insertion des valeurs dans mvRef a l'aide de differentes
            // methodes
            //
            //
     
     
            return mvRef;    // Ceci cree une erreur de type memory a la 2 eme
                                  // iteration
    Quelles sont ces "differentes méthodes" ?

    Si ce n'est que des méthodes d'insertion (type push_back) pas de problème. Si tu essaye d'accéder directement à un élément, il peut y avoir problème : reserve n'initialise pas les éléments supplémentaires, il ne change que la capacité du vecteur et pas sa taille.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Par défaut
    num4x4Blocks est une variable qui ne change jamais apres l'affectation precisee elle vaut 12'288.

    Et seul un push back est effectue sur mvRef. De cette facon:

    for (int i=0; i<num4x4Blocks; i++)
    {
    int v0 = blocks4x4[i]->motionVector[0];
    int v1 = blocks4x4[i]->motionVector[1];
    mvRef.push_back(v0);
    mvRef.push_back(v1);
    }

    // ou blocks4x4 est un sdt::vector<Block> , Block est une classe de mon
    // programme qui possede differentes instances dont int[2] motionVector

    Mais je precise que ce n est qu a une certaine iteration que l appelle a

    return mvRef;

    engendre une erreur de memoire

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Par défaut
    De quelle taille est chaque objet Block ? Si tu en crées 12288 avec 100Ko chacun, tu atteinds plus d'1Go de mémoire... Si une copie de mvRef est faite en quittant la procédure avant que blocks4x4 soit désalloué, c'est peut-être la goutte d'eau qui fait déborder le vase ? Les Block sont-ils correctement désalloués après la première itération ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Par défaut
    Oui avant de retourner mvRef j effectue un blocks4x4.clear() qui vide le vecteur d'objet de type Block, et par la meme occasion desalloue la memoire reservee pour blocks4x4 n'est-ce pas?

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par angediablo
    Oui avant de retourner mvRef j effectue un blocks4x4.clear() qui vide le vecteur d'objet de type Block, et par la meme occasion desalloue la memoire reservee pour blocks4x4 n'est-ce pas?
    Non, la mémoire est toujours allouée. Mais ça ne devrait pas poser plus de problème que ça.

    Au cas où, si tu veux vraiment essayer de vider physiquement ton tableau, tu peux utiliser ce code à la place du clear() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sdt::vector<Block>().Swap(blocks4x4);
    Tu peux aussi tenter d'utiliser un std::deque, qui a la même interface publique que std::vector mais qui est moins contraint au niveau de l'allocation mémoire.

Discussions similaires

  1. Probleme avec std::vector push_back
    Par raphchar dans le forum C++
    Réponses: 4
    Dernier message: 19/12/2011, 14h18
  2. [STL] déclaration et manipulation de std::vector
    Par archer dans le forum SL & STL
    Réponses: 3
    Dernier message: 04/11/2007, 21h56
  3. Probleme avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 2
    Dernier message: 12/03/2007, 16h51
  4. Problem avec std::vector
    Par boiteweb dans le forum SL & STL
    Réponses: 5
    Dernier message: 29/04/2006, 12h56
  5. [std::vector] probleme de desallocation memoire
    Par jcloupgarou dans le forum SL & STL
    Réponses: 15
    Dernier message: 20/04/2006, 11h39

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