C++ 中的 CrtIsValidHeapPointer(block) 错误 -- 内存删除

问题描述 投票:0回答:1

基本上,在代码中有一个类“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++ heap-memory dynamic-memory-allocation
1个回答
1
投票

c++默认的析构函数会调用所有成员的析构函数。 所以这一行:ptr->slotStack.~CharStack(); 导致析构函数被调用两次,我认为这导致 CharStack 中的内存被释放两次。

我的建议:删除那行,我认为你不需要它。

© www.soinside.com 2019 - 2024. All rights reserved.