jef*_*yer 4 c++ containers smart-pointers unique-ptr c++11
好的,所以每个人都知道应该像瘟疫那样避免使用原始指针并选择智能指针,但是在实现容器时这个建议是否适用?这就是我想要完成的事情:
template<typename T> class AVLTreeNode {
public:
T data;
unique_ptr<AVLTreeNode<T>> left, right;
int height;
}
Run Code Online (Sandbox Code Playgroud)
Unique_ptr可以使容器函数编写起来更麻烦,因为我不能让多个原始指针以优雅的方式临时指向同一个对象.例如:
unique_ptr<AVLTreeNode<T>> rotate_right(unique_ptr<AVLTreeNode<T>> n1)
{
unique_ptr<AVLTreeNode<T>> n2 = n1->left;
n1->left = n2->right;
n2->right = n1;
// n1 must now be referenced through the longer name n2->right from now on
n2->right->recalculate_height();
n2->recalculate_height();
return n2;
}
Run Code Online (Sandbox Code Playgroud)
(在这个例子中,这不是什么大不了的事,但我可以想象它会如何成为一个问题).我应该采取这样的问题,强烈暗示容器应具有良好的旧来实现new
,delete
和原始指针?为避免编写析构函数,似乎非常麻烦.
在显示容器时,我通常不会使用智能指针.原始指针(恕我直言)是不是要避免像瘟疫.如果要强制执行内存所有权,请使用智能指针.但通常在容器中,容器拥有构成数据结构的指针所指向的内存.
如果在你的设计中,一个AVLTreeNode
独特的拥有它的左右儿童,你想表达unique_ptr
,那很好.但是,如果您希望AVLTree
拥有所有AVLTreeNode
s,并且使用原始指针,则这同样有效(并且我通常编码它的方式).
相信我,我不是反智能指针.我是发明者unique_ptr
.但这unique_ptr
只是工具箱中的另一个工具.在工具箱中拥有良好的智能指针并不是万灵药,盲目地使用它们并不能代替精心设计.
更新以回复评论(评论框太小):
我经常使用原始指针(很少拥有).我的编码风格的一个很好的样本存在于开源项目libc ++中.可以在"浏览SVN"链接下浏览源.
我更喜欢资源的每个分配都可以在某个地方的析构函数中释放,因为异常安全问题,即使通常的解除分配发生在析构函数之外.当分配由单个指针拥有时,智能指针通常是工具箱中最方便的工具.当分配由大于指针(例如容器或类Employee
)的东西所拥有时,原始指针通常是组成较大对象的数据结构的便利部分.
最重要的是,我从不分配任何资源而不知道哪个对象拥有该资源,无论是智能指针,容器还是其他什么.
归档时间: |
|
查看次数: |
1139 次 |
最近记录: |