Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 赋值运算符重载不会';在散列函数中发生重置时不起作用_C++_Segmentation Fault_Hashtable_Assignment Operator_Dynamic Allocation - Fatal编程技术网

C++ 赋值运算符重载不会';在散列函数中发生重置时不起作用

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中发生重新灰化时,赋值运算符重载函数抛出分段错误。但是,如果没有发生再灰化,则分配操作员可以正常工作。我想我可能已经看代码太久了,如果有一组新的眼睛来扫描代码,问题就会变得很明显

谢谢

以下是我的主要成员职能:

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;