C++ 赋值运算符重载不会';在散列函数中发生重置时不起作用
我正在实现一个HashMap,我有一个复制构造函数和一个赋值操作符重载函数。当HashMap中发生重新灰化时,赋值运算符重载函数抛出分段错误。但是,如果没有发生再灰化,则分配操作员可以正常工作。我想我可能已经看代码太久了,如果有一组新的眼睛来扫描代码,问题就会变得很明显 谢谢 以下是我的主要成员职能:C++ 赋值运算符重载不会';在散列函数中发生重置时不起作用,c++,segmentation-fault,hashtable,assignment-operator,dynamic-allocation,C++,Segmentation Fault,Hashtable,Assignment Operator,Dynamic Allocation,我正在实现一个HashMap,我有一个复制构造函数和一个赋值操作符重载函数。当HashMap中发生重新灰化时,赋值运算符重载函数抛出分段错误。但是,如果没有发生再灰化,则分配操作员可以正常工作。我想我可能已经看代码太久了,如果有一组新的眼睛来扫描代码,问题就会变得很明显 谢谢 以下是我的主要成员职能: HashMap::HashMap() :hasher{hash}, Buckets_Array{new Node* [initialBucketCount]}, currentBucket
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*[hm.currentBucketCount];
fillArray(newNodeArray, hm.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)
{
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;
}
}
由于问题只发生在重新灰化发生时,我更倾向于检查重新灰化函数,但是如果我不调用赋值运算符重载方法,则重新灰化函数可以正常工作。我真的很感激任何帮助
谢谢。在
HashMap&HashMap::operator=(const HashMap&hm)
中,您忘记在调用arrayCopy
之前,使用hm.currentBucketCount
分配this->currentBucketCount
您应该交换这两条语句并保留旧值currentBucketCount
以调用deleteLinkedList
:
arrayCopy(hm.Buckets_Array, newNodeArray, currentBucketCount);
currentBucketCount = hm.currentBucketCount;
取而代之
int oldBucketCount = currentBucketCount;
currentBucketCount = hm.currentBucketCount;
arrayCopy(hm.Buckets_Array, newNodeArray, currentBucketCount);
...
for (int i = 0; i < oldBucketCount; i++)
{
deleteLinkedList(Buckets_Array[i]);
}
int oldBucketCount=currentBucketCount;
currentBucketCount=hm.currentBucketCount;
阵列副本(hm.Buckets\u阵列、newNodeArray、currentBucketCount);
...
对于(int i=0;i
或者
arrayCopy(hm.Buckets\u数组,newnoderray,hm.currentBucketCount);
//currentBucketCount=hm.currentBucketCount;
//sh=hm.sz;
对于(int i=0;i
在顶部,hm.Buckets\u数组的大小是hm.currentBucketCount
,但是您将此->currentBucketCount
(我认为可能不同)传递给arrayCopy
。类似地,调用deleteLinkedList()
的循环运行hm.currentBucketCount
次,这可能不等于this->Buckets\u数组的实际大小
对deleteLinkedList
循环没有帮助。@IgorTandetnik是的,你完全正确。我更新我的答案。谢谢你!非常感谢。非常感谢。正是这些小事让你着迷。
arrayCopy(hm.Buckets_Array, newNodeArray, currentBucketCount);
currentBucketCount = hm.currentBucketCount;
int oldBucketCount = currentBucketCount;
currentBucketCount = hm.currentBucketCount;
arrayCopy(hm.Buckets_Array, newNodeArray, currentBucketCount);
...
for (int i = 0; i < oldBucketCount; i++)
{
deleteLinkedList(Buckets_Array[i]);
}
arrayCopy(hm.Buckets_Array, newNodeArray, hm.currentBucketCount);
// currentBucketCount = hm.currentBucketCount;
// sh = hm.sz;
for (int i = 0; i < currentBucketCount; i++)
{
deleteLinkedList(Buckets_Array[i]);
}
currentBucketCount = hm.currentBucketCount;
sh = hm.sz;