c++ - 链表节点的 RAII 风格 C++ 类

标签 c++ algorithm memory-management raii

我现在正在玩链表作为练习。

我在 Cracking The Coding Interview 中查看的示例book 没有 LinkedList (manager) 类,只有 Nodes,你在 main 函数中卡在 head Node 上。

我查阅了 C++ 实现,但大多数似乎比 C++ 更像 C 风格,即不是面向对象的。它们使用结构,没有类,并且有一个用于删除列表的静态方法,您需要明确记住要调用该方法。我想编写一个合理的 RAII(资源获取即初始化)风格的 C++ 类,带有合理的析构函数来处理内存释放,我只想使用一个 Node 类(没有 LinkedList 类)。

我看到这个工作的唯一方法是让 Node 的析构函数删除下一个 Node(如果有的话),但我读到这种递归删除是一个坏主意,因为你最终创建了一个调用堆栈与链表长度相同。

总结一下我的问题:

  • 如果用 C++ 编写一个面向对象的类来处理链表,您是否必须有一个 LinkedList(管理器)类来处理其析构函数中列表节点的删除?
  • 如果没有,您将如何处理节点的破坏?

谢谢!

最佳答案

If writing an object-oriented class to handle linked lists in C++, do you have to have a LinkedList (manager) class which handles the deletion of the list nodes in its destructor?

不,结构是由节点之间的链接定义的,因此不需要单独的管理器对象。有时拥有一个会更方便,特别是如果您正在设计像 STL 这样的库并希望所有容器都具有相似的接口(interface),但您当然可以只使用节点类型来实现链表。

If not, how would you deal with destruction of Nodes?

避免递归的一种方法是在删除之前从列表中删除每个节点,例如:

~node() {
    while (node * victim = next) {
        next = victim->next;
        victim->next = nullptr;
        delete victim;
    }
}

关于c++ - 链表节点的 RAII 风格 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11795035/

相关文章:

python - 控制洗牌距离

c++ - any_cast std::any 指向特定指针类型的指针

c - 在不生成重复项的情况下查找字符串的所有唯一排列

c++ - boost::any_cast(const any&) 使用 const_cast<>——这不是潜在的 UB 吗?

python - 任意数量嵌套 for 循环的算法

c - 在循环内声明时数组基地址正在更改

c - 如何确定我的系统上 malloc() 结果的最小对齐?

php - gc_collect_cycles 函数有什么用?

c++ - 如何针对大量整数优化 C++/C 代码

c++ - 在扩展期间将 vector 成员插入 vector : vector. push_back(vector[0])