gpt4 book ai didi

C++链表内存管理

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:04 30 4
gpt4 key购买 nike

我正在尝试用 C++ 制作我自己的基本单链表作为学习练习,但我在内存管理部门遇到了一些困难。就目前而言,我有...

“节点”类:

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

Node::Node()
{
}

Node::~Node()
{
delete[] value;
}

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

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;
}

我正在尝试按如下方式使用此代码(再次为简洁起见,我省略了一些内容):

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;

}

main 中删除列表的最后一次调用产生错误:

调试断言失败!表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

我在这里做错了什么?

最佳答案

各种 Node::value 指向的数据不是动态分配的,因此您不应该删除它们。应用“所有权”的概念,节点应该制作自己的数据拷贝,他们拥有并可以删除这些数据,或者节点不拥有数据,因此他们不应该负责删除数据。

您还可以使用引用计数实现多重所有权,就像 Objective-C 所做的那样(有关更多信息,请参见 Objective-C Memory Management Rules),但您必须小心避免所有权循环。您经常会在第三方智能指针中找到某种类型的引用计数,例如 Boost's smart_ptr library .由于您这样做是为了获得学习经验,因此自己动手可能比使用库更有意义。当然,您现在也可以使用图书馆,让您专注于您想要学习的内容。

One day a student came to Moon and said: “I understand how to make a better garbage collector. We must keep a reference count of the pointers to each cons.”

Moon patiently told the student the following story:

“One day a student came to Moon and said: ‘I understand how to make a better garbage collector...

关于C++链表内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1570377/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com