2015-06-15 2 views
0

Есть ли способ получить доступ к shared_ptr для этого:Доступ к shared_ptr для этого указателя

e.g.

#include <boost/enable_shared_from_this.hpp> 
#include <boost/shared_ptr.hpp> 
#include <cassert> 

class Y: public boost::enable_shared_from_this<Y> 
{ 
public: 
    void foo(); 
    void bar(); 
    boost::shared_ptr<Y> f() 
    { 
     return shared_from_this(); 
    } 
}; 

void Y::foo() 
{ 
    boost::shared_ptr<Y> p(this); 
    boost::shared_ptr<Y> q = p->f(); 
    q->bar(); 
    p.reset(); 
    q.reset(); 
} 

void Y::bar() 
{ 
    std::cout << __func__ << std::endl; 
} 

int main() 
{ 
    Y y; 
    y.foo(); 
} 

Когда я запускаю программу, я получаю segafult после выполнения бара. Я понимаю причину seg-fault.

Моя последняя цель - иметь слабый указатель, а затем перезвонить.

Благодаря

ответ

0

срок службы Либо y «s управляет общими указателями или выходит из области видимости, когда кадр стека он создан на Завершает. Придумайте и придерживайтесь его.

Если этот код может работать так или иначе, это разрушило бы y дважды, один раз, когда он вышел из рамки в конце main и однажды, когда последний shared_ptr ушел.

Может быть, вы хотите:

int main() 
{ 
    std::shared_ptr<Y> y = std::make_shared<Y>(); 
    y->foo(); 
} 

Здесь экземпляр будет уничтожен, когда его последняя shared_ptr уходит. Это может произойти в конце main, но если foo бежит от копии shared_ptr, это может продлить время жизни объекта. Он может бежать слабым указателем и, возможно, сообщить деструктору глобального объекта, что объект ушел.

Точка слабого указателя должна быть способна продвигать его до сильного указателя, который может продлить время жизни объекта. Это не будет работать, если нет возможности динамически управлять временем жизни объекта.

Смежные вопросы