我只对带有模板的链表使用原始指针。例如,成员数据 Node<T>* head;
当我插入一个节点时,其中一行将是 head = new Node<T>(data);
。
但是,现在我需要使用智能指针,但我不确定如何将其更改为使用智能指针。成员数据是否会更改为 shared_ptr<Node<T>> head;
而另一行会更改为
head = shared_ptr<Node<T>>( new <Node<T>>(data) );
?
原文由 Mark 发布,翻译遵循 CC BY-SA 4.0 许可协议
您不需要为链表使用智能指针,因为该语句没有意义。您 不要 将智能指针用于低级数据结构。您将智能指针用于高级程序逻辑。
就低级数据结构而言,您使用 C++ 标准库中的标准容器类,例如
std::list
[*] ,它可以解决所有内存管理问题,而无需使用任何智能指针内部。如果您 真的 需要自己的高度专业化/优化的自定义容器类,因为整个 C++ 标准库不适合您的要求,并且您需要 替换
std::list
,std::vector
,std::unordered_map
和其他经过优化、测试、记录和安全的容器——我非常怀疑! –,那么无论如何您都必须手动管理内存,因为这样一个专门的类的重点几乎肯定是需要内存池、写时复制甚至垃圾收集等技术,所有这些都与典型的智能指针相冲突相当简单的删除逻辑。用 赫伯萨特 的话来说:
Herb Sutter 和 Bjarne Stroustrup 的 C++ Core Guidelines 中也表达了类似的内容:
在 C++ 中使用原始指针编写链表类可能是一项有用的 学术 练习。在 C++ 中使用智能指针编写链表类是一项毫无意义的学术练习。在生产代码中使用这两种自制的东西中的任何一种几乎都是错误的。
[*] 或者只是
std::vector
,因为由于缓存局部性,无论如何这几乎总是更好的选择。