Оператор удаления C ++ - PullRequest
       1

Оператор удаления C ++

0 голосов
/ 30 сентября 2011

Я относительно новичок в C ++, и у меня есть проблема, которую я действительно не понимаю.Мой код создает связанный список.Это на самом деле длиннее, чем это, но я вырубил его для целей этого вопроса.

Когда я запускаю код, он добавляет три узла, а затем, когда идет удаление узла с URI b, он вызывает оператор delete и в итоге удаляет узел, но затем кажетсявернуться к оператору delete (когда я пройдусь по нему), и это уничтожит весь мой список.

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>

using namespace std;


class CLinkedList
{
protected:
    class ip_uri_store
    {
    public:
        string uri, ip;
        ip_uri_store* next;

        ip_uri_store(const string& URI, const string& IP) {uri = URI, ip = IP, next = NULL;}
    };
    typedef ip_uri_store* nodeAddress;

    nodeAddress head;

    void AddNode(const string&, const string&, nodeAddress);
    void DeleteNode(const string&, nodeAddress, nodeAddress);

public:
    CLinkedList() {head = NULL;}
    void AddNode(const string& URI, const string& IP) {AddNode(URI, IP, head);}
    void DeleteNode(const string& URI) {DeleteNode(URI, head, head);}

};

void CLinkedList::AddNode(const string& URI, const string& IP, nodeAddress node)
{
    nodeAddress temp = new ip_uri_store(URI, IP);
    temp->uri = URI;
    temp->ip = IP;
    temp->next = head;
    head = temp;
}

void CLinkedList::DeleteNode(const string& URI, nodeAddress node, nodeAddress behindNode)
{
    if(node)
    {
        if(!node->uri.compare(URI))
            node == head ? head = head->next : behindNode->next = node->next;
        else
            DeleteNode(URI, node->next, node);

        delete node;
    }
}



int main(int argc, char* argv[])
{
    CLinkedList lList;
    lList.AddNode("a", "1");
    lList.AddNode("b", "2");
    lList.AddNode("c", "3");
    lList.DeleteNode("b");

    return 0;
}

Ответы [ 3 ]

3 голосов
/ 30 сентября 2011

Вы звоните delete node;, даже если сравнение не удается (т. Е. node->uri != URI).

if(!node->uri.compare(URI))
{
    node == head ? head = head->next : behindNode->next = node->next;
    delete node;
}
else
    DeleteNode(URI, node->next, node);

Кроме того, условие, кажется, инвертировано.

1 голос
/ 30 сентября 2011

Во-первых, вы должны использовать std :: list и избегать переизобретения мира. В любом случае, если вы по какой-то причине застряли в этой реализации:

  • temp-> uri = URI; и temp-> ip = IP; в методе AddNode бесполезны, потому что члены уже инициализированы в конструкторе класса ip_uri_store.
  • удаление заголовка списка происходит потому, что «удалить узел» следует только в случае node-> uri.compare (URI) в методе DeleteNode.

Опять же, вы должны серьезно подумать об использовании стандартных классов ...

0 голосов
/ 30 сентября 2011

Вы вызываете delete на всех узлах. Его необходимо переместить в условное выражение, чтобы удалить только те узлы, которые соответствуют URI

if(!node->uri.compare(URI)) {
    node == head ? head = head->next : behindNode->next = node->next;
    delete node;
} else {
    DeleteNode(URI, node->next, node);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...