C++链表内存管理

Ben*_*key 1 c++ memory-management

我试图在C++中创建自己的基本单链表作为学习练习,我在内存管理部门遇到了一些困难.目前我有......

'Node'类:

class Node
{
public:
    char *value;
    Node *next;
    Node();
    ~Node();
};

Node::Node()
{
}

Node::~Node()
{
    delete[] value;
}
Run Code Online (Sandbox Code Playgroud)

然后是我的列表(为了简洁,我省略了某些方法调用):

class LinkedList
{
private:

    Node *head;

public:

    LinkedList();
    ~LinkedList();
    void Add(char **x);

};

LinkedList::LinkedList()
{
    head = 0;
}

LinkedList::~LinkedList()
{
    Node *temp;
    Node *current = head;

    while(current)
    {
        temp = current;
        current = current->next;
        delete temp;
    }
}

void LinkedList::Add(char **x)
{
    Node *nodeToAdd = new Node();
    nodeToAdd->value = *x;
    nodeToAdd->next = NULL;

    Node *current = head;

    if(!head)
    {
        head = nodeToAdd;
        return;
    }

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

    current->next = nodeToAdd;
}
Run Code Online (Sandbox Code Playgroud)

我试图使用如下代码(为了简洁,我省略了一些东西):

int main()
{
    LinkedList *list = new LinkedList();

    char *alpha = "alpha";
    char *beta = "beta";
    char *charlie = "charlie";
    char *delta = "delta";
    char *echo = "echo";

    list->Add(&alpha);
    list->Add(&beta);
    list->Add(&charlie);
    list->Add(&delta);
    list->Add(&echo);

    delete list;

}
Run Code Online (Sandbox Code Playgroud)

主要删除列表的最后一次调用会产生错误:

Debug Assertion Failed! Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

我在这做错了什么?

out*_*tis 7

各种指向的数据Node::value不是动态分配的,因此不应删除它们.应用"所有权"的概念,节点应该创建自己的数据副本,它们拥有并可以删除,或者节点不拥有数据,因此它们不应该负责删除它.

您还可以使用引用计数实现多个所有权,例如Objective-C(请参阅Objective-C内存管理规则以获取更多信息),但您必须小心避免所有权周期.您经常在第三方智能指针中找到某种类型的引用计数,例如Boost的smart_ptr库.由于您是为了学习体验而这样做,因此使用库比使用库更有意义.当然,您现在也可以使用图书馆,让您专注于您想要学习的任何内容.

有一天,一名学生来到Moon并说道:"我理解如何制作一个更好的垃圾收集器.我们必须保留对每个缺点的指针的引用计数."

Moon耐心地告诉学生以下故事:

"有一天,一个学生来到Moon说:'我明白如何制作一个更好的垃圾收集器......