ошибка нарушения прав чтения - PullRequest
0 голосов
/ 15 марта 2010
class Node{
      private:
              string name;
              Node** adjacent;
              int adjNum;
      public:
             Node();
             Node(string, int adj_num);
             Node(const Node &);
             bool addAdjacent(const Node &);
             Node** getAdjacents();
             string getName();
             ~Node();
      };

bool Node::addAdjacent(const Node &anode){
     Node** temp;   
     temp= new Node*[adjNum+1];
     for(int i=0;i<adjNum+1;i++)
         temp[i]=adjacent[i];
     temp[adjNum]=const_cast<Node *>(&anode);
     delete[] adjacent;
     adjacent=new Node*[adjNum+1];
     adjacent=temp;
     delete[] temp;
     adjNum++;
     return true;
}

int main()
{
    Node node1("A",0);
    Node node2("B",0);
    node1.getName();
    node1.addAdjacent(node2);
    system("PAUSE");
    return 0;
}

когда программа доходит до этой части:

for(int i=0;i<adjNum+1;i++)
     temp[i]=adjacent[i];

там написано, что чтение места нарушения доступа 0xcccccccc. Класс должен выделять память для смежных областей, но я думаю, что это не так, как я могу решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 15 марта 2010
 adjacent=new Node*[adjNum+1];
 adjacent=temp;
 delete[] temp;

Это похоже на ошибку. Вы, вероятно, хотели написать:

adjacent = temp;

и все.

Кроме того, я думаю, что проблема заключается в

for(int i=0;i<adjNum+1;i++)

Вы копируете adjNum+1 элементов, хотя (я полагаю) adjacent содержит только adjNum элементов. Удалите +1 из цикла for.

1 голос
/ 15 марта 2010

Помимо упомянутых проблем, возможно, вам не хватает инициализации для adjacent, например как это:

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

Обратите внимание на параметр unsigned, отрицательный adj_num, скорее всего, не имеет смысла в этом контексте.

Если вы не инициализируете adjacent, он содержит некоторое значение мусора, а разыменование или передача его в delete[] приводит к неопределенному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...