Использование shared_ptr - PullRequest
       0

Использование shared_ptr

2 голосов
/ 01 августа 2011

Когда я использую необработанные указатели, довольно просто «перемещаться» вверх / вниз по дереву, но когда я использовал 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-> parent, когда он присваивает p, и это нечто я хочу.

Любые подсказки?

Редактировать

Это реальный код:

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_;


};

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Вы не можете создать общий указатель из этого, как вы это делаете в

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 голос
/ 01 августа 2011

Есть ли причина, по которой вы должны манипулировать умными указателями? Поскольку вы пишете синхронный код, а структура не кажется ленивой, вас не интересуют вопросы владения - это тупой обход. Так что можно использовать сырые указатели.

...