2016-10-23 64 views
0

當我運行valgrind時,在運算符new的方法插入時出現一個錯誤; 我知道這可能意味着我必須刪除節點ñ我如何嘗試這麼多事情來嘗試刪除它,但它只是給了我更多的錯誤。請幫忙。需要幫助解決內存泄漏錯誤

class key_value_sequences { 
public: 

    struct node{ 
     int key; 
     vector<int> values; 
     node* next; 
     node* prev; 
    }; 

    key_value_sequences() { 
    } 
    ~key_value_sequences() { 
    } 
    key_value_sequences(const key_value_sequences& A) { 
     n = A.n; 
     head = A.head; 
     tail = A.tail; 
     v = A.v; 
    } 
    key_value_sequences& operator=(const key_value_sequences& A) { 
     if (this == &A) return *this; 
     n = A.n; 
     head = A.head; 
     tail = A.tail; 
     v = A.v; 
     return *this; 
    } 
    // YOU SHOULD USE C++ CONTAINERS TO AVOID RAW POINTERS 
    // IF YOU DECIDE TO USE POINTERS, MAKE SURE THAT YOU MANAGE MEMORY PROPERLY 

    // IMPLEMENT ME: SHOULD RETURN SIZE OF A SEQUENCE FOR GIVEN KEY 
    // IF NO SEQUENCE EXISTS FOR A GIVEN KEY RETURN -1 
    int size(int key) const { 
     if (find(v.begin(), v.end(), key)!=v.end()) { 
     node* temp = head; 
     while(temp != NULL) { 
      if (temp->key == key) { 
      return temp->values.size(); 
      } 
      else temp = temp->next; 
     } 
    } 
     else return -1; 
    } 

    // IMPLEMENT ME: SHOULD RETURN POINTER TO A SEQUENCE FOR GIVEN KEY 
    // IF NO SEQUENCE EXISTS FOR A GIVEN KEY RETURN nullptr 
    const int* data(int key) const { 
     if (find(v.begin(), v.end(), key)!=v.end()) { 
     node* temp = head; 
     while(temp != NULL) { 
      if (temp->key == key) { 
      return temp->values.data(); 
      } 
      else temp = temp->next; 
     } 
    } 
     else return nullptr; 
    } 

    // IMPLEMENT ME: INSERT VALUE INTO A SEQUENCE IDENTIFIED BY GIVEN KEY 
    void insert(int key, int value) { 
     if(v.size() == 0) { //empty list 
     v.push_back(key); 
     n = new node; 
     n->prev = NULL; 
     n->key = key; 
     n->values.push_back(value); 
     head = n; 
     tail = n; 
     } 
     else if((find(v.begin(), v.end(), key)!=v.end())) { //if key exists already 
     node* temp = head; 
     while(temp != NULL) { 
      if (temp->key == key) { 
      temp->values.push_back(value); 
      break; 
      } 
      else temp = temp->next; 
     } 
     } 
     else { //if theres no existing key 
     v.push_back(key); 
     n = new node; 
     n->key = key; 
     n->values.push_back(value); 
     n->prev = tail; 
     tail->next = n; 
     tail = n; 
     tail->next = NULL; 
     } 
    } 
private: 
    vector<int> v; 
    node* n; 
    node* head; 
    node* tail; 
}; // class key_value_sequences 

#endif // A3_HPP 
+1

你的拷貝構造函數的代碼,你的析構函數和你'運營商='是不是與'insert'方法是一致的。析構函數應該依次刪除節點。複製構造函數和'operator ='應該執行列表的深層副本,不共享節點。 – Franck

+0

*「您應該使用C++容器避免原始指針」* - 很好的建議。爲什麼不遵循它? –

回答

0

insert方法:

if(v.size() == 0) { //empty list 
    v.push_back(key); 
    n = new node; 
    n->prev = NULL; 
    n->key = key; 
    n->values.push_back(value); 
    head = n; 
    tail = n; 
    } 

您沒有設置head->next爲NULL。我懷疑這可能是插入第二個值時的問題。

while(temp != NULL) { // <<<<< Is temp uninitialized? 
     if (temp->key == key) { 
     temp->values.push_back(value); 
     break; 
     } 
     else temp = temp->next; 

它相當危險的未初始化指針爲NULL

+0

我添加了它,但它仍然給了我同樣的錯誤 –

+0

也錯過了我在while循環之上寫的一行代碼。 –