但是,现在我需要使用智能指针,我不知道如何更改它以使用智能指针.是否将成员数据改变为shared_ptr< Node< T>>头;而另一条线将变为
head = shared_ptr< Node< T>>(new< Node< T>>(data));?
解决方法
就低级数据结构而言,您使用C标准库中的标准容器类,如std :: list [*],它无论如何都可以解决所有内存管理问题,而无需在内部使用任何智能指针.
如果你真的需要你自己的高度专业化/优化的自定义容器类,因为整个C标准库不适合你的需求,你需要替换std :: list,std :: vector,std :: unordered_map和其他优化的,测试过的,记录和安全的容器 – 我非常怀疑! – 然后你必须手动管理内存,因为这样一个专门的类几乎肯定需要内存池,写时复制甚至垃圾收集等技术,所有这些都与典型的智能指针冲突相当简单的删除逻辑.
用Herb Sutter的话来说:
Never use owning raw pointers and delete,except in rare cases when
implementing your own low-level data structure (and even then keep
that well encapsulated inside a class boundary).
这些方面的内容也在Herb Sutter’s and Bjarne Stroustrup’s C++ Core Guidelines中表达:
This problem cannot be solved (at scale) by transforming all owning
pointers to unique_ptrs and shared_ptrs,partly because we need/use
owning “raw pointers” as well as simple pointers in the implementation
of our fundamental resource handles. For example,common vector
implementations have one owning pointer and two non-owning pointers.
使用原始指针在C中编写链表类可能是一项有用的学术练习.用C语言编写一个带有智能指针的链表列表是一个毫无意义的学术练习.在生产代码中使用这两个自制的东西中的任何一个几乎都是自动错误的.
[*]或者只是std :: vector,因为缓存局部性几乎总是更好的选择.