2016-10-23 63 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循环之上写的一行代码。 –