C ++ удалить не работает? - PullRequest
       12

C ++ удалить не работает?

3 голосов
/ 18 апреля 2010

У меня проблема с удалением и деструктором (я уверен, что я делаю глупую ошибку здесь, но пока не смог понять это).

Когда я захожу в деструктор и пытаюсь вызвать delete по указателю, появляется сообщение «Невозможно получить доступ к памяти по адресу некоторый адрес ».

Соответствующий код:

/*
 * Removes the front item of the linked list and returns the value stored
 * in that node.
 *
 * TODO - Throws an exception if the list is empty
 */
std::string LinkedList::RemoveFront()
{
    LinkedListNode *n = pHead->GetNext(); // the node we are removing
    std::string rtnData = n->GetData(); // the data to return

    // un-hook the node from the linked list
    pHead->SetNext(n->GetNext());
    n->GetNext()->SetPrev(pHead);

    // delete the node
    delete n;
    n=0;

    size--;
    return rtnData;
}

и

/*
 * Destructor for a linked node.
 *
 * Deletes all the dynamically allocated memory, and sets those pointers to 0.
 */
LinkedListNode::~LinkedListNode()
{
    delete pNext; // This is where the error pops up
    delete pPrev;
    pNext=0;
    pPrev=0;
}

Ответы [ 3 ]

5 голосов
/ 18 апреля 2010

Кажется, что вы удаляете следующий и предыдущий узлы списка из деструктора. Что, если pNext и pPrev равны LinkedListNode*, означает, что вы рекурсивно удаляете весь список: - (

Попробуйте это:

std::string LinkedList::RemoveFront()
{
    LinkedListNode *n = pHead->GetNext(); // the node we are removing
    std::string rtnData = n->GetData(); // the data to return

    // un-hook the node from the linked list
    pHead->SetNext(n->GetNext());
    n->GetNext()->SetPrev(pHead);

    n->SetNext(0);
    n->SetPrev(0);
    // delete the node
    delete n;
    n=0;

    size--;
    return rtnData;
}

LinkedListNode::~LinkedListNode()
{
}

(На самом деле вам даже не нужно сбрасывать указатель prev и next на 0, так как вы все равно собираетесь удалить узел. Я оставил эти операторы, потому что они по крайней мере переводят узел в согласованное состояние, которое является В общем, хорошая идея. Если вы позже, например, измените стратегию управления памятью и решите сохранить неиспользуемые узлы для последующего повторного использования, это может иметь значение.)

1 голос
/ 18 апреля 2010

Кажется, что ваш LinkedListNode удаляет своих соседей, поэтому, когда вы удаляете один узел, он затем уничтожает весь список - обратите внимание, что вы не устанавливаете pNext и pPrev в NULL, когда вы удаляете свой узел .

Также ваш деструктор LinkedListNode проблематичен даже в том случае, когда вы хотите уничтожить весь список: наличие delete pNext и delete pPrev приведет к нескольким вызовам одного и того же деструктора (и я думаю, что в конечном итоге стек переполнение).

0 голосов
/ 18 апреля 2010

На самом деле вы не должны связываться с соседями по узлу. Это для класса списка, чтобы сделать - подключите их правильно. В деструкторе вы можете установить их на нуль, но если вы не выделили динамически что-то еще - вам не нужно вызывать delete

...