デストラクタ、コピーコンストラクタ、代入演算子で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で