C ++删除运算符

时间:2011-09-30 12:25:11

标签: c++ visual-c++

我对C ++比较陌生,我有一个我真的不明白的问题。我的代码创建了一个链表。它实际上比这长,但为了这个问题,我把它砍了下来。

当我运行代码时,它会添加三个节点,然后当它删除带有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 个答案:

答案 0 :(得分:3)

即使比较失败(即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 :(得分:1)

首先,你应该使用std :: list并避免重塑世界。 无论如何,如果由于某种原因你坚持这个实现:

  • temp-&gt; uri = URI;和temp-&gt; ip = IP;在AddNode方法中没用,因为成员已经在ip_uri_store类的构造函数中初始化。
  • 删除列表的头部是因为“删除节点”只应在DeleteNode方法中的case node-&gt; uri.compare(URI)中完成。

同样,你应该认真考虑使用标准类......

答案 2 :(得分:0)

您正在所有节点上调用delete。它需要在条件内移动,因此您只删除与URI匹配的节点

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