当我使用原始指针时,很容易“遍历”树上/下,但是当我使用shared_ptr而不是内置指针时,情况并非如此。我的意思是我不能这样做(没有副作用):
shared_ptr<T> p(some_shared);
while (p->parent_)//here I'm assuming that the type pointed to has parent_ member
{
p = p->parent_;
}
这对我不起作用,因为当它分配给p时它看起来像重置了p-&gt; parent并且这不是我想要的。
任何线索?
修改的
这是真实的代码:
template<class Key_T, class Value_T>
class Node
{
public:
/*typedefs*/
#define ptr_type std::shared_ptr
typedef Key_T key_type;
typedef ptr_type<key_type> key_ptr;
typedef Value_T value_type;
typedef ptr_type<value_type> value_ptr;
typedef Colors color_type;
typedef color_type* color_raw_ptr;
typedef ptr_type<color_type> color_ptr;
typedef std::pair<key_ptr,value_ptr> data_type;
typedef ptr_type<data_type> data_ptr;
typedef Node<key_type,value_type> node_type;
typedef node_type* node_raw_ptr;
typedef ptr_type<node_type> node_ptr;
explicit Node()
{}
explicit Node(const key_type& key,
const value_type& value,
const color_type& color,
node_ptr parent = nullptr,
node_ptr left = nullptr,
node_ptr right = nullptr);
~Node()
{
cout << "Bye now";
}
const node_ptr& root()const
{
node_ptr tmp = node_ptr(this);
while (tmp->parent_)
{///this seems to reset resources
tmp = tmp->parent_;
}
return tmp;
}
private:
data_ptr data_;
color_ptr color_;
node_ptr parent_;
node_ptr left_;
node_ptr right_;
};
答案 0 :(得分:2)
您无法像在
中那样创建共享指针node_ptr tmp = node_ptr(this);
当你创建一个共享指针时,它会假定给它的指针的所有权 - 所以这会在重新分配tmp时删除它。
关于shared_ptr的主题:http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/sp_techniques.html#from_this
你需要像这样创建共享指针:
node_ptr tmp = node_ptr(new node());
那么如何获得root()的共享指针?如果您使用boost,则可以使用shared_from_this:http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/enable_shared_from_this.html
您可以使用普通指针,或者将函数作为外部或静态函数,将shared_ptr作为参数。
答案 1 :(得分:1)
你有没有理由操纵智能指针?既然你正在编写同步代码并且结构似乎并不懒惰,那么你并不真正关心所有权问题 - 这是一个愚蠢的遍历。所以可以使用原始指针。