【发布时间】:2011-07-25 04:15:44
【问题描述】:
好的,所以每个人都知道应该像瘟疫一样避免原始指针并更喜欢智能指针,但是这个建议在实现容器时是否适用?这就是我想要完成的:
template<typename T> class AVLTreeNode {
public:
T data;
unique_ptr<AVLTreeNode<T>> left, right;
int height;
}
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;
}
(在这个例子中这没什么大不了的,但我可以想象它怎么会成为一个问题)。我是否应该将这些问题作为强烈暗示容器应该使用旧的new、delete 和原始指针来实现?避免编写析构函数似乎非常麻烦。
【问题讨论】:
-
除了一次用传统的包含防护代替 pragma 之外,我已经复制了您的代码并且不使用 clang/libc++ 复制您的错误。我建议预处理 driver.cpp,检查它,看看你是否在其中看到
unique_ptr。您看到的行为可能与unique_ptr无关,例如不包括<memory>的C++11 版本。
标签: c++ c++11 containers smart-pointers unique-ptr