读取访问冲突错误

时间:2010-03-14 21:03:18

标签: c++ visual-c++ oop

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 个答案:

答案 0 :(得分:3)

 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 :(得分:1)

除了提到的问题之外,您可能缺少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[]会导致未定义的行为。