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