【发布时间】:2016-09-24 13:21:51
【问题描述】:
我已经开始在 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* 指针。 每当我尝试添加它时,程序都会导致内存错误,我认为正在分配的内存也在 main 结束时被释放,因为所有的 Node* 都在那里。
我应该修复我的析构函数吗?我应该改变整个界面吗?
提前致谢!
【问题讨论】:
-
delete用于使用new创建的东西。 -
所以当 main() 完成运行时 Node*s 将被销毁..?我只是想了解我是否在这里泄漏了任何内存
-
@user 换句话说,如果你没有使用
new,你就不必使用delete。如果您没有使用new,则您的示例中不可能存在内存泄漏 -
@user49428
n1、n2和n3在堆栈上创建(即,不使用new),因此当它们超出范围时,它们使用的内存可用.请注意,列表类包含一个指向节点的指针,节点可能在列表之前被销毁,这会使您的列表处于不良状态(悬空指针)。 -
严格来说不是关于您的问题,但您似乎正在学习 C++98 / C++03。你可能最好学习 C++11——还有 C++14,但这只是修复了 C++11 的一些小疏忽,所以关于 C++11 的文献并没有过时,而我肯定会称之为 C ++98 / C++03 那个。
标签: c++ memory-management memory-leaks