首页 文章

C中的Linked List析构函数:我应该删除吗?

提问于
浏览
0

我已经开始在C中实现一些数据结构,从Linked Lists开始 . 来自Java背景,我仍然围绕着指针和对象的生命周期 .

LinkedList:

struct Node
{
    int data;
    Node *next;
};

class LinkedList
{
private:
    Node *head;
    Node *tail;
    int length;

public:
    LinkedList();
    ~LinkedList();

    void addToHead(Node &newHead);
    void popHead();

    void printList();
};

然后我就像这样实现了它:

LinkedList::LinkedList()
{ 
    head = NULL;
    tail = NULL;
    length = 0;
}

LinkedList::~LinkedList(){}

void LinkedList::addToHead(Node& newHead)
{
    newHead.next = head;
    head = &newHead;
    length++;
}

void LinkedList::popHead()
{
    Node *currHead = head;
    head = head->next;
    length--;
}

void LinkedList::printList()
{
    Node *curr = head;

    while(curr)
    {
        curr = curr->next;  
    }
}

最后有一个简单的主要内容:

int main()
{
    LinkedList list;
    Node n1 = {3};
    Node n2 = {4};
    Node n3 = {5};
    list.addToHead(n1);
    list.addToHead(n2);
    list.addToHead(n3);
    list.printList();
    list.popHead();
    list.printList();

    return 0;
}

这是一个相当天真的实现,我想知道我是否必须提供一个正确的析构函数,它在迭代时删除Node *指针 . 每当我尝试添加它时,程序都会导致内存错误,我认为正在分配的内存也会在main的末尾解除分配,因为所有的Node *都存在于那里 .

我应该修复我的析构函数吗?我应该改变整个界面吗?

提前致谢!

1 回答

  • 2

    虽然您的代码中没有内存泄漏,但我认为您应该更改您的界面 .

    您的链接列表没有做您认为它正在做的事情 - 取得其内容的所有权 . 不拥有其内容的链接列表是一个奇怪的野兽,可能是你不想要的东西 .

    使其获得所有权的一种简单方法是将您的设计更改为使用 std::unique_ptr 而不是原始指针 . 然后你的 addToHead 函数将被更改为采用 std::unique_ptr r值引用指针(或者只是在内部创建新 std::unique_ptr 的原始指针,如果它太高级)

    这是您的实现更改为使用 std::unique_ptr . 它有点粗糙和准备,但应该让你的方式:

    #include <memory>
    
    struct Node
    {
        Node(int i) : data(i) 
        {}
    
        int data;
        std::unique_ptr<Node> next;
    };
    
    class LinkedList
    {
    private:
        std::unique_ptr<Node> head;
        Node *tail;
        int length;
    
    public:
        LinkedList();
        ~LinkedList();
    
        void addToHead(std::unique_ptr<Node>&& newHead);
        void popHead();
    
        void printList();
    };
    
    LinkedList::LinkedList()
    { 
        head = NULL;
        tail = NULL;
        length = 0;
    }
    
    LinkedList::~LinkedList(){}
    
    void LinkedList::addToHead(std::unique_ptr<Node>&& newHead)
    {
        newHead->next = std::move(head);
        head = std::move(newHead);
        length++;
    }
    
    void LinkedList::popHead()
    {
        head = std::move(head->next);
        length--;
    }
    
    void LinkedList::printList()
    {
        auto* curr = head.get();
    
        while(curr)
        {
            curr = curr->next.get();  
        }
    }
    
    int main()
    {
        LinkedList list;
        list.addToHead(std::make_unique<Node>(3));
        list.addToHead(std::make_unique<Node>(4));
        list.addToHead(std::make_unique<Node>(5));
        list.printList();
        list.popHead();
        list.printList();
    
        return 0;
    }
    

相关问题