Dav*_*ill 4 c++ algorithm memory-management raii
我现在正在玩链接列表作为练习.
我在Cracking The Coding Interview书中看到的例子中没有LinkedList(管理器)类,只有Nodes,你可以在主函数中挂起头节点.
我查找了C++实现,但大多数似乎比C++更C风格,即不是面向对象的.它们使用结构体,没有类,并且有一个静态方法来删除列表,您需要明确记得调用它.我想写一个合理的RAII(资源获取是初始化)风格的C++类,带有合理的析构函数来处理内存释放,我想只使用一个Node类(没有LinkedList类).
我看到有这个工作的唯一方法是让Node的析构函数删除下一个Node,如果有的话,但是我已经读过这种递归删除是一个坏主意,因为你最终创建了一个与之相同长度的callstack.链表.
总结一下我的问题:
谢谢!
如果编写一个面向对象的类来处理C++中的链表,你是否必须有一个LinkedList(manager)类来处理它的析构函数中列表节点的删除?
不,结构由节点之间的链接定义,因此不需要单独的管理器对象.有时候有一个更方便,特别是如果你正在设计像STL这样的库并希望所有容器都有类似的接口,但你当然可以用一个节点类型实现一个链表.
如果没有,你将如何处理节点的破坏?
避免递归的一种方法是在删除之前从列表中删除每个节点,例如:
~node() {
while (node * victim = next) {
next = victim->next;
victim->next = nullptr;
delete victim;
}
}
Run Code Online (Sandbox Code Playgroud)