我已经开始在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 回答
虽然您的代码中没有内存泄漏,但我认为您应该更改您的界面 .
您的链接列表没有做您认为它正在做的事情 - 取得其内容的所有权 . 不拥有其内容的链接列表是一个奇怪的野兽,可能是你不想要的东西 .
使其获得所有权的一种简单方法是将您的设计更改为使用
std::unique_ptr
而不是原始指针 . 然后你的addToHead
函数将被更改为采用std::unique_ptr
r值引用指针(或者只是在内部创建新std::unique_ptr
的原始指针,如果它太高级)这是您的实现更改为使用
std::unique_ptr
. 它有点粗糙和准备,但应该让你的方式: