0

デストラクタ、コピーコンストラクタ、代入演算子でHashMapクラスを実装しています。私がHashMapオブジェクトを作成し、そのオブジェクトにキーと値を追加し、それを新しい空オブジェクトに割り当てると、 "double free or corruption"エラーが発生します。しかし、HashMapにキーを追加せずに同じことを行うと、コードはうまく動作します。私はまた、割り当てオペレータのオーバーロードの実装から配列のコピー関数をコメントアウトすると、コードも正常に実行されますが、私が割り当てようとしているオブジェクトは配列のコピーを持っていないことに気付きました。バックトレースは、エラーが、このライン上にあることを言う:コピーコンストラクタと代入演算子のオーバーロードがC++で機能しない

else if (node->next == nullptr) 

すべてのヘルプは高く評価され、感謝!ここで

HashMap::HashMap() 
    :hasher{hash}, Buckets_Array{new Node* [initialBucketCount]}, currentBucketCount{initialBucketCount}, sz{0} 

{ 
    fillArray(Buckets_Array, currentBucketCount); 


} 


HashMap::HashMap(const HashMap& hm) 
    :hasher{hm.hasher}, Buckets_Array{new Node*[hm.currentBucketCount]},currentBucketCount{hm.currentBucketCount}, sz{hm.sz} 
{ 
    arrayCopy(hm.Buckets_Array, Buckets_Array, currentBucketCount); 

} 


HashMap::~HashMap() 
{ 
    for(int i = 0; i < currentBucketCount; i++) 
    { 
     deleteLinkedList(Buckets_Array[i]); 
    } 

    delete[] Buckets_Array; 
} 


HashMap& HashMap::operator=(const HashMap& hm) 
{ 
    if (this != &hm) 
    { 

     Node** newNodeArray = new Node*[currentBucketCount]; 
     fillArray(newNodeArray, currentBucketCount); 
     arrayCopy(hm.Buckets_Array, newNodeArray, currentBucketCount); 
     currentBucketCount = hm.currentBucketCount; 
     sz = hm.sz; 

     for (int i = 0; i < currentBucketCount; i++) 
     { 
      deleteLinkedList(Buckets_Array[i]); 
     } 

     delete[] Buckets_Array; 
     Buckets_Array = newNodeArray; 

    } 

    return *this; 
} 

void HashMap::add(const std::string& key, const std::string& value) 
{ 
    // REHASH IF EXCEEDED LOAD FACTOR 
    double futureLoadFactor = double((sz + 1))/double(currentBucketCount); 

    if (futureLoadFactor > maximumLoadFactor) 
    { 
     std:: cout << "REHASHING KEYS....." << std::endl; 
     rehashKeys(); 
    } 

    unsigned int index = getIndex(key); 

    if (!checkExists(Buckets_Array[index], key, value)) 
    { 

     if (Buckets_Array[index] == nullptr) 
     { 
      Node* n = new Node; 
      n->key = key; 
      n->value = value; 
      n->next = nullptr; 
      Buckets_Array[index] = n; 
     } 

     else 
     { 

      addToEnd(Buckets_Array[index], key, value); 

     } 

     sz += 1; 
    } 


} 

は、私が使用するいくつかのヘルパーメンバ関数です:

void HashMap::fillArray(Node** nodeArray, int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     nodeArray[i] = nullptr; 
    } 
} 



void HashMap::arrayCopy(Node** source, Node**& target, int arrysz) 
{ 

    for (int i = 0; i < arrysz; i++) 
    { 
     if (source[i] != nullptr) 
     { 
      Node* temp = source[i]; 
      target[i] = temp; 
     } 

     else 
     { 
      target[i] = nullptr; 
     } 
    } 


} 

void HashMap::deleteLinkedList(Node* node) 
{ 


    if (node == nullptr) 
    { 
     return; 
    } 
    else if (node->next == nullptr) 
    { 
     delete node; 
    } 
    else 
    { 

     Node* next = node->next; 
     delete node; 
     deleteLinkedList(next); 
    } 

} 

void HashMap::addToEnd(Node*& node, std::string key, std::string value) 
{ 

    if (node == nullptr) 
    { 
     Node* n = new Node; 
     n->key = key; 
     n->value = value; 
     n->next = nullptr; 
     node = n; 

    } 


    else 
    { 

     addToEnd(node->next, key, value); 

    } 

} 

この

HashMap HP; 
HashMap HH; 
HashMap HP.add("k", "v"); 
HH = HP; 

私に "ダブル無料または破損エラー" を与えます。私は、エラーのarraycopyで

答えて

0

せずにプログラムが実行さHP.addの一部を削除する場合

は、しかし、あなたは他に1つのハッシュマップから要素へのポインタをコピーします。したがって、2つのマップに同じポインタがあり、結果的に同じオブジェクトを2回削除します。

新しい要素を割り当て、あるオブジェクトから別のオブジェクトにデータをコピーする必要があります。

関連する問題