C++链表分段故障

C++链表分段故障,c++,c,C++,C,我在removeElement函数中遇到了一个分段错误_水桶是 HashTableVoidEntry指针数组。这个项目应该实施 存储名称的简单哈希表 GDB告诉我 removeElement函数就是它崩溃的地方。有人能指出问题所在吗 请我不知道如何解决这个问题。我正试图为你创造条件 检查元素在链接列表中的位置。第一个if块告诉我 如果我要移除的元素位于头部。else if块告诉我if 它位于末尾,else块用于列表中的其他任何位置。我还是 学习链表,所以我确信我犯了一个愚蠢的错误 els

我在removeElement函数中遇到了一个分段错误_水桶是 HashTableVoidEntry指针数组。这个项目应该实施 存储名称的简单哈希表

GDB告诉我 removeElement函数就是它崩溃的地方。有人能指出问题所在吗 请我不知道如何解决这个问题。我正试图为你创造条件 检查元素在链接列表中的位置。第一个if块告诉我 如果我要移除的元素位于头部。else if块告诉我if 它位于末尾,else块用于列表中的其他任何位置。我还是 学习链表,所以我确信我犯了一个愚蠢的错误

    else
    {
        prev->_next = e->_next;
        delete e;
        return true;
    }
EleHashTableVoid::HashTableVoid()
{
    _buckets = (HashTableVoidEntry**)malloc(TableSize * sizeof(HashTableVoidEntry*));
    for(int i = 0; i < TableSize; i++)
    {
        _buckets[i] = NULL;
    }
}
// Removes an element in the hash table. Return false if key does not exist.
bool HashTableVoid::removeElement(const char * key)
{
    int h = hash(key);
    HashTableVoidEntry * e = _buckets[h];
    HashTableVoidEntry * prev = NULL;
    while((e != NULL) && (strcmp(key, e->_key) != 0))
    {
        prev = e;
        e = e->_next;
    }
    if(e != NULL)
    {
        if(prev == NULL)
        {
            if(e == _buckets[h])
            {
                _buckets[h] = e -> _next;
                delete e;
                return true;
            }
        }
        else if(e -> _next == NULL)
        {
            prev->_next = NULL;
            delete e;
            return true;
        }
        else
        {
            prev->_next = e->_next;
            delete e;
            return true;
        }
    }
    else
    {
        return false;
    }
}

我看这段代码没有问题,但是您会不小心将一个项目哈希两次吗


BTW,你不需要其他if if子句,因为它基本上和EFER子句一样。

看起来很好,也许数据在调用那个函数的时候已经被破坏了。我在C++中没有使用GCC,但是你检查过NULL是否被定义了?它不需要是C++的——比较0是更好的。不是侮辱你的情报,而是每个HasabTaboVoIdItIt对象都单独分配了新的HASTABLE VooIdIt条目吗?它可能不是你现在看到的崩溃,但是一个错误是你不能从“否则if”或“否则”子句中的“子桶”中删除“E”。因此,如果你用它做任何事情,你的代码就会崩溃。我不明白,我该怎么办?我应该不使用delete吗?我有另一个处理重复项的函数。这很好,所以我不认为这是一个问题。你说else if基本上是else是什么意思?这两个代码块基本上执行相同的功能。如果你在元素本身中存储一个指向const string键的指针,你能在析构函数中删除它吗?