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)
我在这做错了什么?
各种指向的数据Node::value不是动态分配的,因此不应删除它们.应用"所有权"的概念,节点应该创建自己的数据副本,它们拥有并可以删除,或者节点不拥有数据,因此它们不应该负责删除它.
您还可以使用引用计数实现多个所有权,例如Objective-C(请参阅Objective-C内存管理规则以获取更多信息),但您必须小心避免所有权周期.您经常在第三方智能指针中找到某种类型的引用计数,例如Boost的smart_ptr库.由于您是为了学习体验而这样做,因此使用库比使用库更有意义.当然,您现在也可以使用图书馆,让您专注于您想要学习的任何内容.
有一天,一名学生来到Moon并说道:"我理解如何制作一个更好的垃圾收集器.我们必须保留对每个缺点的指针的引用计数."
Moon耐心地告诉学生以下故事:
"有一天,一个学生来到Moon说:'我明白如何制作一个更好的垃圾收集器......