0 votes

Erreur d'accès en lecture.datatables.

classe Noeud{
      private:
              string nom;
              Noeud** adjacent;
              int adjNum;
      public:
             Noeud();
             Noeud(string, int adj_num);
             Noeud(const Noeud &);
             bool ajouterAdjacent(const Noeud &);
             Noeud** getAdjacents();
             string getNom();
             ~Noeud();
      };

bool Noeud::ajouterAdjacent(const Noeud &unoeud){
     Noeud** temp;   
     temp= new Noeud*[adjNum+1];
     for(int i=0;i(&unoeud);
     delete[] adjacent;
     adjacent=new Noeud*[adjNum+1];
     adjacent=temp;
     delete[] temp;
     adjNum++;
     return true;
}

int main()
{
    Noeud noeud1("A",0);
    Noeud noeud2("B",0);
    noeud1.getNom();
    noeud1.ajouterAdjacent(noeud2);
    system("PAUSE");
    return 0;
}

quand le programme arrive à cette partie:

for(int i=0;i

`

il affiche Violation d'accès à l'emplacement de lecture 0xcccccccc. La classe doit allouer la mémoire pour adjacent, mais je pense qu'elle ne l'a pas faite, comment puis-je résoudre ce problème ?

`

3voto

strager Points 41713
adjacent = new Node*[adjNum+1];
adjacent = temp;
delete[] temp;

Cela ressemble à un bug. Vous vouliez probablement écrire :

adjacent = temp;

et c'est tout.

Aussi, je pense que le problème se situe avec

for(int i=0;i

``

Vous copiez adjNum+1 éléments, même si (je suppose) adjacent ne contient que adjNum éléments. Supprimez le +1 de la boucle for.

``

1voto

Georg Fritzsche Points 59185

Outre les problèmes mentionnés par strager, vous pourriez manquer d'initialisation pour adjacent, par exemple comme ceci :

Node::Node(std::string name, unsigned adj_num)
  : name(name)
  , adjacent((adj_num > 0) ? new Node*[adj_num] : 0)
  , adjNum(adj_num)
{}

_Remarquez le paramètre unsigned, un adj_num négatif est probablement sans signification dans ce contexte._

Si vous n'initialisez pas adjacent, il contient une valeur indéterminée et le déréférencer ou le passer à delete[] entraîne un comportement indéfini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X