gpt4 book ai didi

c++ - 无法删除我的临时指针?

转载 作者:行者123 更新时间:2023-11-30 00:53:11 24 4
gpt4 key购买 nike

我在删除指针时遇到问题。我不认为我在做任何编译器非法的事情或任何事情,但也许我是,所以如果有人能解释我逻辑中的缺陷,我将不胜感激。我希望下面的函数应该足以提供帮助,因为整件事要转录很多,但如果需要更多代码,请告诉我,我会添加它!

下面是一个从我创建的链表中删除储物柜的函数。我已尽力涵盖所有可能的情况。当我尝试实际释放我想删除的储物柜的内存时,问题就出现了。我试图删除引用已锁定的临时变量的行已被注释掉,因为代码与它们一起中断。显然,没有它们,我无法随心所欲地删除储物柜。

int SelfStorageList::removeLockersOverdue() {

int lockersDeleted = 0;

if (isEmpty()) {
return 0;
}

if (head->objLocker.isRentOverdue && head==tail) { //If that was the only locker, the tail needs to be updated to = head = 0
delete head;
head = tail = 0;
return ++lockersDeleted;
}

LockerNode *prev = head;
LockerNode *curr = head->next;

while (curr != 0) {

if((curr == tail) && curr->objLocker.isRentOverdue) { //If the current locker is tail and needs deleting
LockerNode *temp = curr;
curr = prev;
//delete temp;
lockersDeleted++;
}


if(prev->objLocker.isRentOverdue) { //General case: Previous locker needs deleting
LockerNode *temp = prev;
prev = prev->next;
curr = curr->next;
//delete temp;
lockersDeleted++;

}

else { //Update the pointers if not updated anywhere else

prev = prev->next;
curr = curr->next;

}

}

return lockersDeleted;

}

任何“指针”? (可怕的双关语。:p)

最佳答案

因为您正在维护一个单链表,所以我看到您在遍历列表时正在跟踪 prev 指针。当然,这是应该的,因为如果给定节点是单链接的,则您无法在不记得其前一个节点是什么的情况下获得链表中给定节点的前一个节点。你的问题只是你的逻辑被破坏了:如果需要删除,你需要删除 curr 节点,并修补 prev 节点以指向它的 next 在您delete curr 之前指向curr->next 的指针。

想一想:您正在做的是删除 prev 节点,但可能还有一个“比那个更早”的节点仍然指向 prev 节点你刚刚删除的。下次您遍历列表时,您将迭代到以前分配的节点,到那时可能会为一些完全不同的目的分配这些节点。您的内存分配器未通过某些内部断言,因为很可能在您下次调用 removeLockersOverdue() 时,内存尚未分配给其他东西,并且您仍然在那里找到已经删除的同一个节点,并再次发现它已经过期,并再次删除它,并且您的内存分配器提示您正在删除未分配的内存。 (如果它能为您提供清晰的消息,那就太好了,不是吗!)

此外,处理第一个节点和最后一个节点的特殊情况可以简化和通用化;我会避免为您重写它,这样您就可以看看是否可以自己简化它。

关于c++ - 无法删除我的临时指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com