0

소멸자, 복사 생성자 및 대입 연산자로 HashMap 클래스를 구현하고 있습니다. HashMap 객체를 만들고 키와 값을 추가하고 새로운 빈 객체에 할당하려고하면 "double free or corruption"오류가 발생합니다. 그러나 HashMap에 키를 추가하지 않고 동일한 작업을 수행하면 코드가 올바르게 실행됩니다. 또한 할당 연산자 오버로드 구현에서 arrayCopy 함수를 주석 처리하면 코드도 제대로 실행되지만 배열에 복사 할 객체는 할당되지 않은 것으로 나타났습니다. 역 추적은 오류가이 라인에 말한다 :복사 생성자 및 할당 연산자 오버로드가 C++에서 작동하지 않습니다.

else if (node->next == nullptr) 

어떤 도움 감사합니다, 감사합니다!

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; 

가 나에게 "더블 무료 또는 손상 오류"를 제공합니다 : 여기

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; 
    } 


} 

내가 사용하는 일부 도우미의 멤버 함수이다. 내가 오류 arrayCopy에서

답변

0

없이 프로그램이 실행되는 HP.add 부분을 제거하면

그러나 당신은 다른에 하나 개의 해시 맵에서 요소로 포인터를 복사합니다. 그래서, 당신은 두 개의 맵에서 같은 포인터를 가지며 결과적으로 같은 오브젝트를 두 번 삭제합니다.

새 요소를 할당하고 한 개체의 데이터를 다른 개체로 복사해야합니다.