我正在使用Node创建一个列表容器。
这就是Node结构的样子; mFirst
是List类的私有数据成员。
struct Node{
Node(const EType & d, Node *n = nullptr) : mData(d), mNext(n) { }
EType mData;
Node *mNext;
};
Node *mFirst;
有一个函数用于从容器中删除元素。
问题发生在 temp2->mNext = temp->mNext;
。
该元素已删除但程序将崩溃。
我不知道造成这个问题的原因。
template <typename EType>
void Set<EType>::remove(const EType & x) {
if (isElement(x)) {
Node *temp = mFirst;
Node *temp2 = nullptr;
while(temp->mData != x) {
temp2 = temp;
temp = temp->mNext;
}
if (temp2 == nullptr) {
mFirst = temp->mNext;
} else {
temp2->mNext = temp->mNext;
}
}
}
如果我将该行更改为:
temp = temp->mNext;
temp2 = temp2->mNext;
temp2 = temp;
没有任何反应,该功能无效。
两个表达式都不一样吗?
答案 0 :(得分:0)
对于您使用的每个指针,您必须检查它是否与0不同:您只检查tmp2,但是您也应检查tmp。
while(tmp && tmp->mData !=x)
您需要检查列表中是否找到该元素
if(tmp)
{
if(!tmp2)
{
mFirst = tmp->mNext;
delete tmp;//now it is deleted
}
else
{
tmp2->mNext = tmp->mNext;
delete tmp;//now it is deleted
}
创建列表时还需要注意:最后一个元素必须将mNext设置为0。
答案 1 :(得分:0)
首先。你的最后一个代码什么都不做。再读一遍。
然后,即使在循环中,也永远不会检查列表的结尾
你怎么知道该元素已被删除?如果您的程序在此行崩溃,则不会删除任何内容
而且我没有看到任何删除,因此您永远不会删除该对象,它仍然会在内存中。
你能告诉我们确切的崩溃信息吗?使用gdb可能