2010-03-14 132 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[]會導致未定義的行爲。