C++中的链表析构函数:我应该删除吗?
Linked List destructor in C++: should I delete?
我已经开始在C++中实现一些数据结构,从链表开始。来自Java背景,我仍然在思考指针和对象的生命周期。
链接列表:
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* 指针。每当我尝试添加它时,程序都会导致内存错误,我认为正在分配的内存也在主节点结束时被释放,因为所有节点都在那里。
我应该修复我的析构函数吗?我应该更改整个界面吗?
提前感谢!
虽然你的代码中没有内存泄漏,但我认为你应该改变你的界面。
你的链表没有做你可能认为它做的事情 - 拥有它的内容。一个不拥有其内容的链表是一个奇怪的野兽,可能是你不想要的。
让它拥有所有权的一种简单方法是更改您的设计以使用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;
}
相关文章:
- 我应该删除矢量<short>吗?
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 我应该如何使用remove_if删除两个数字范围内的元素
- 我应该在 v8::外部手动删除指针吗?
- 我应该删除来自其他函数或类方法的指针吗?
- 我应该在使用后删除 QObject 指针吗?
- 我应该使用std ::删除以从列表中删除元素
- C++中的链表析构函数:我应该删除吗?
- 删除从另一个指针分配的指针,我应该再次删除另一个指针吗?
- 我应该采取什么方式使用 qt:all 类继承自 QObject 或删除 新后手动删除
- 我应该删除智能指针的移动构造函数和移动赋值吗
- 如果我写一个新的展示位置?我应该如何编写普通运算符删除
- 我应该删除函数中的本地指针吗?(C++)
- 对于经常创建和删除的游戏对象,我应该使用什么容器
- 我应该删除一个取消引用的指针数组吗?
- 我应该删除.h文件中的字符数组吗
- 如果指针是函数自变量并且通过引用传递值,我应该删除它吗
- 我应该删除类解构器中 int 的指针(在 C++ 中)吗?
- 在这种情况下,我应该删除指针吗?
- 我应该删除传递给函数作为参数的指针吗?