基本上,在代码中有一个类“Board”,包括来自结构对象“slot”的称为头和尾的指针,指向动态分配的列表,这些列表位于插槽的类对象的属性中(不同的类具有动态分配的列表);因此,链表就是这样创建的。综上所述,head 和 tail 指针指向动态分配的 char 列表的指针。
struct slot
{
slot* next;
slot* prev;
CharStack slotStack; // every slot has slotstack
};
有一点,我想删除堆栈(动态分配的列表)和指向列表的槽*指针,然后重新排列,以免弄乱链表。在下面的代码中,我遍历链表,当涉及到我要删除的相应索引时,它转到 if 表达式。
void Board::destroySlot(int index)
{
// call ~CharStack()
// delete slot
// change the counts
slot* ptr = head;
int i = 0;
while (ptr != NULL)
{
if (i == index)
{
char ch;
while (!ptr->slotStack.isEmpty())
{
ptr->slotStack.pop(ch);
}
// delete dynamically alocated list
ptr->slotStack.~CharStack();
if (ptr == head)
{
slot* temp = ptr->next;
//delete ptr;
head = temp;
head->prev = NULL;
}
else if (ptr == tail)
{
slot* temp = ptr->prev;
//delete ptr;
tail = temp;
tail->next = NULL;
}
else
{
slot* tempPrev = ptr->prev;
slot* tempNext = ptr->next;
// deleting the node slot
//delete ptr; // GIVES ERROR // Deleting on another heap?
// connecting the slots
tempPrev->next = tempNext;
tempNext->prev = tempPrev;
}
// Removing from the counts
ch == 'x' ? xCnt -= 4 : oCnt -= 4;
break;
}
ptr = ptr->next;
i++;
}
}
在这部分,在我完成它之后,我无法删除 ptr(不是字符列表,那些带有“delete ptr”的),它会在 visual studio 中抛出这个错误。
不知道为什么会这样,我可以删除这个函数开头和另一个函数中的 head ptr。但是,在循环之后或循环中删除它会出错。
编辑:我想如果我们不做“ptr->slotStack.~CharStack();”它只是删除 stackArray,动态分配的 char 列表,它不会崩溃。该列表只是结构“插槽”属性的私有属性。为什么会因此导致崩溃?
c++默认的析构函数会调用所有成员的析构函数。 所以这一行:ptr->slotStack.~CharStack(); 导致析构函数被调用两次,我认为这导致 CharStack 中的内存被释放两次。
我的建议:删除那行,我认为你不需要它。