0

我正在编写优先级队列,但出现错误:

free():在 tcache 2 中检测到双重空闲

我知道问题出在PriorityQueue::Remove(int value)方法上。该方法尝试按值删除元素。此方法在元素已被删除时返回 TRUE,否则返回 FALSE。

这是代码:

bool PriorityQueue::Remove(int value)
{
    Element_t *actualItem = this->GetHead();

    Element_t *temporary = nullptr;

    if (actualItem == nullptr) {

        return false;
    }

    while (actualItem != nullptr) {

        if (actualItem->value == value) {

            if (actualItem == this->GetHead()) {
                if (actualItem->pNext == nullptr) {
                    delete actualItem;
                    m_pHead = nullptr;

                    return true;
                }

                m_pHead = actualItem->pNext;
                delete actualItem;

                return true;
            }


            if (actualItem->pNext == nullptr) {
                delete actualItem;
                temporary->pNext = nullptr;

                return true;
            }

            temporary->pNext = actualItem->pNext;
            delete actualItem;

            return true;
        }

        temporary = actualItem;
        actualItem = actualItem->pNext;
    }

    return false;
}

规格

优先级队列从优先级最高的项目到优先级最低的项目排序。方法GetHead()返回队列中具有最高优先级的第一项。队列元素的结构只有值和指向队列中下一个元素的指针。

请问,有没有人看到错误使用的错误delete

编辑:没有双重免费。代码运行良好。问题只出在我的电脑上——可能是架构损坏(不知道)。当我尝试在另一台 PC 上编译代码时,一切正常。

4

1 回答 1

1

我在这段代码中没有看到任何双重删除,所以问题必须在其他地方。例如,如果PriorityQueue没有正确遵循3/5/0 规则,并且在应该深复制指针时是浅复制指针。没有显示足够的代码来诊断错误的根本原因。

但是,显示的代码是不必要的重复,它可以简化很多:

bool PriorityQueue::Remove(int value)
{
    Element_t *actualItem = m_pHead;
    if (actualItem)
    {
        Element_t *temporary = nullptr;
        do
        {
            if (actualItem->value == value)
            {
                if (actualItem == m_pHead)
                    m_pHead = actualItem->pNext;
                if (temporary)
                    temporary->pNext = actualItem->pNext;
                delete actualItem;
                return true;
            }
            temporary = actualItem;
            actualItem = actualItem->pNext;
        }
        while (actualItem);
    }
    return false;
}
于 2021-03-03T23:27:47.413 回答