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 :

Probleme de débordement de mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 112
    Par défaut Probleme de débordement de mémoire
    Salut tout le monde

    J'utilise des vecteurs de structure et j'ai un problème de débordement de mémoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct PseudoConcept
    {
     vector<int> intent;
     vector<int> extent;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct InfoContext
    {
    PseudoConcept couple;
    PseudoConcept pseudo;
    vector <int> concept;
    int num_concept;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef vector<InfoContext*> ContextVect;
    En fait le débordement est localisé dans une boucle quand j'essaye de remplir une variable de "ContextGlobal" de type ContextVect

    Le code est le suivant :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
    ContextVect ContextGlobal;
    InfoContext ContextElement;
    PseudoConcept p,c;
    vector<int> cc;
     
    ContextGlobal.reserve(couverture);
     
    for(int n=0;n<10;n++)
    {
     
     c.intent.clear();
     c.extent.clear();
     p.intent.clear();
     p.extent.clear();
     ContextElement.couple.intent.clear();
     ContextElement.couple.extent.clear();
     ContextElement.pseudo.intent.clear();
     ContextElement.pseudo.extent.clear();
     ContextElement.concept.clear();
     
     ContextGlobal[n]->couple.intent.clear();
     ContextGlobal[n]->couple.extent.clear();
     ContextGlobal[n]->pseudo.intent.clear();
     ContextGlobal[n]->pseudo.extent.clear();
     ContextGlobal[n]->concept.clear();
     
     
     c.intent.resize(1);
     c.extent.resize(1);
     c.intent.push_back(exp_courant);//exp_courant déja rempli 
     c.extent.push_back(attr_courant); //attr_courant déja rempli 
     ContextElement.couple=c;
    	for (int q=0;q<20;q++)
    	{
           p.intent.push_back(1);
           p.extent.push_back(0);   
    	ContextElement.pseudo=p;
    	cc=resultat;// resultat est un vecteur de int déjà rempli
    	ContextElement.concept=cc;
    	ContextElement.num_concept=1;
    	ContextGlobal[n]->couple=ContextElement.couple;
    	ContextGlobal[n]->pseudo=ContextElement.pseudo;
    	ContextGlobal[n]->concept=ContextElement.concept;
    	ContextGlobal[n]->num_concept=ContextElement.num_concept;
     
     
     
     
    }
     
     
    }

  2. #2
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Par défaut
    Je me trompe peut être mais cette partie de code me semble étrange.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ContextGlobal[n]->couple.intent.clear();
     ContextGlobal[n]->couple.extent.clear();
     ContextGlobal[n]->pseudo.intent.clear();
     ContextGlobal[n]->pseudo.extent.clear();
     ContextGlobal[n]->concept.clear();
    Tu appelles un attribut de la structure "pointée" par ContextGlobal[n], mais es tu sur d'avoir initialisé ContextGlobal[n] avant?

    Le compilateur ne dirait rien puisque ton pointeur est sensé pointer un objet de type correspondant. Mais si à l'execution l'objet n'existe pas...

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 112
    Par défaut
    Je ne sais pas a quel niveau devrais-je l'initialiser.En dehors de la boucle???
    En plus je dois l'initialiser à quelle valeur??Je suis débutante en C++ et toutes ces structures me bloquent.

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Par défaut
    En fait... ce n'est pas si compliqué.
    Avant de chercher où initialiser, sois sure d'avoir saisi la logique.

    Avant de pouvoir accéder aux attributs d'une structure, il te faut être sur, qu'elle existe. Donc avant d'appeler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ContextGlobal[n]->couple.intent.clear();
    Tu dois être sure que le pointeur stocké à la position n de ton vecteur, pointe sur une structure existante.
    Donc où initialiser, dépend de la logique de ton programme et d'où tu appelles la fonction qui exécute la boucle.

    Dans les faits, oui, l'initialisation doit se faire avant l'accès à la structure.

    Mais par sécurité, tu pourrais ajouter ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(ContextGlobal[n] != NULL)
    {
    ContextGlobal[n]->couple.intent.clear();
     ContextGlobal[n]->couple.extent.clear();
     ContextGlobal[n]->pseudo.intent.clear();
     ContextGlobal[n]->pseudo.extent.clear();
     ContextGlobal[n]->concept.clear();
    }
    Ce test va simplement s'assurer que le pointeur n'est pas null avant que le programme n'accède à la structure.


    Autre chose, que cherches tu à faire avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (int q=0;q<20;q++)
    	{
           p.intent.push_back(1);
           p.extent.push_back(0);   
    	ContextElement.pseudo=p;
    	cc=resultat;// resultat est un vecteur de int déjà rempli
    	ContextElement.concept=cc;
    	ContextElement.num_concept=1;
    	ContextGlobal[n]->couple=ContextElement.couple;
    	ContextGlobal[n]->pseudo=ContextElement.pseudo;
    	ContextGlobal[n]->concept=ContextElement.concept;
    	ContextGlobal[n]->num_concept=ContextElement.num_concept;
    }
    Parce que là, tu remplaces successivement les attributs de ContextGlobal[n] par ceux du dernier ContextElement. Tu pourrais tout aussi bien sortir les 4 dernières lignes de la boucle et faire le remplacement une seule fois avec le dernier ContextElement, le résultat serait le même (et tu économiserais des opérations inutiles).

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 112
    Par défaut
    J'ai essayé la solution que tu m'as proposé mais ça se plante tjs.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    ContextVect ContextGlobal;
    InfoContext ContextElement;
    PseudoConcept p,c;
    vector<int> cc;
     
    ContextGlobal.reserve(couverture);
     
    for(int n=0;n<10;n++)
    {
     
     c.intent.clear();
     c.extent.clear();
     p.intent.clear();
     p.extent.clear();
     ContextElement.couple.intent.clear();
     ContextElement.couple.extent.clear();
     ContextElement.pseudo.intent.clear();
     ContextElement.pseudo.extent.clear();
     ContextElement.concept.clear();
     
      if(ContextGlobal[n] != NULL)
    {
     ContextGlobal[n]->couple.intent.clear();
     ContextGlobal[n]->couple.extent.clear();
     ContextGlobal[n]->pseudo.intent.clear();
     ContextGlobal[n]->pseudo.extent.clear();
     ContextGlobal[n]->concept.clear();
    }
     
     
     c.intent.resize(1);
     c.extent.resize(1);
     c.intent.push_back(exp_courant);//exp_courant déja rempli 
     c.extent.push_back(attr_courant); //attr_courant déja rempli 
     ContextElement.couple=c;
    	for (int q=0;q<20;q++)
    	{
           p.intent.push_back(1);
           p.extent.push_back(0);   
    	ContextElement.pseudo=p;
    	cc=resultat;// resultat est un vecteur de int déjà rempli
    	ContextElement.concept=cc;
    	ContextElement.num_concept=1;
     
    }
     
    //Cette partie est en dehors de la boucle je me suis trompée tt a leur
     
    // Le problème vient exactement de ces lignes.Quand je les met en commentaire le programme ne se plante plus.
     
            ContextGlobal[n]->couple=ContextElement.couple;
    	ContextGlobal[n]->pseudo=ContextElement.pseudo;
    	ContextGlobal[n]->concept=ContextElement.concept;
    	ContextGlobal[n]->num_concept=ContextElement.num_concept;
     
    }

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Par défaut
    Ma première explication serait exactement la même que la dernière avec exactement la même solution.

    Il se peut que ce soit là, que tu cherches à accéder à un objet non existant. Essai de mettre le même test pour ces lignes.

    Est ce que tu en comprends l'utilité d'ailleurs? (il ne faut pas que ça te paraisse magic, mais plutot logique)

Discussions similaires

  1. [Wamp] Débordement de mémoire Wamp / windows 7
    Par Dominik94 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 17/03/2011, 16h52
  2. [3.4.0] probleme de consomamtion de mémoire
    Par Sniper37 dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 12/09/2008, 13h13
  3. probleme allocation dynamique de mémoire
    Par totoscill dans le forum C
    Réponses: 18
    Dernier message: 28/02/2008, 16h44
  4. Probleme de mémoire avec FireBird
    Par NicolasR dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/05/2006, 16h28
  5. Probleme mémoire
    Par Malibu31 dans le forum Langage
    Réponses: 4
    Dernier message: 23/03/2006, 17h34

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