2016-10-23 6 views
0

valgrindを実行すると、new演算子のinsertメソッドでエラーが1つ発生します。 これは恐らく、ノードnを削除しなければならないことを意味しています。ノードnを削除しようとしましたが、もっと多くのエラーが発生します。してください。 insert方法でメモリリークエラーを解決するための助けが必要

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'方法と一致していないのコードをNULLにポインタを初期化できません。デストラクタは、ノードを順番に削除する必要があります。コピーコンストラクタと 'operator ='は、ノードを共有するのではなく、リストのディープコピーを実行する必要があります。 – Franck

+0

* "あなたはRAW POINTERSを避ける​​ためにC++コンテナを使用すべきです" * - 良いアドバイス。なぜそれに従っていないのですか? –

答えて

0

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に設定されていません。私は、2番目の値を挿入している間に問題になる可能性があると考えています。かなり危険

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

ITSは

+0

私はそれを追加しましたが、それでも同じエラーが表示されました –

+0

またwhileループの上に書いたコードの行を見逃しました。 –

関連する問題