2010-03-14 144 views
0
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。该类必须分配前后相邻的内存,但我认为它不能解决这个问题?

+1

问题是?.... – Klaim 2010-03-14 21:05:01

+0

我假设你没有分配'毗邻'? – tyranid 2010-03-14 21:06:24

+0

尝试通过valgrind或调试器运行程序。 – strager 2010-03-14 21:06:37

回答

3
adjacent=new Node*[adjNum+1]; 
adjacent=temp; 
delete[] temp; 

这看起来像一个错误。你可能是想写:

adjacent = temp; 

就是这样。

另外,我觉得问题在于

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

你复制adjNum+1元素,即使(我认为)adjacent只包含adjNum元素。从for循环中删除+1

+0

这是真的我编辑了这部分,但也有一个内存分配问题,我也提到了问题。当创建node1对象时,我认为它必须创建相邻的指针并为其分配内存,但它不会。同样的错误仍在继续。 – dbtek 2010-03-14 21:41:38

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[]会导致未定义的行为。