2013-06-14 2 views
1

У меня есть следующие классы:повышение :: shared_ptr сбой, когда применение заканчивается

class Session 
    { 
    public:  
     Session(boost::asio::io_service &io_service) 
     : socket_(io_service) 
     { 
     } 
    } 



class ConnectionHandler: public boost::enable_shared_from_this<ConnectionHandler> { 
     boost::shared_ptr<Session> mySession; 
       //blah blah 
    Broker &theBroker; 
    public:  
//....  
ConnectionHandler(
     boost::shared_ptr<Session> session_ ,/*....*/); 
     ~ConnectionHandler(){ 
     //crash happens here 
     std::cout << "Killing ConnectionHandler " << this << " " << shared_from_this(); 
       }  
//.... 
}; 



class ClientHandler: public EventListener { 
Broker & broker; 
//... 
public: 
ClientHandler(Broker &); 
    boost::shared_ptr<ConnectionHandler > cnnHandler; 
//... 
virtual ~ClientHandler(); 
//... 
}; 

(сессия является членом ConnectionHandler и ConnectionHandler является членом ClientHandler)

хорошо, объекты создаются, как это :

xxx::some_function() 
{ 
//... 
boost::shared_ptr<ClientHandler> clientEntry(new ClientHandler(broker)); 
boost::shared_ptr<ConnectionHandler > cnnHandler(
       new ConnectionHandler(request.session_,broker 
      //...blah blah 
      ) 
        ); 
//and now assign it 
clientEntry->cnnHandler = cnnHandler; 

//and then insert it to a nested std::map container somewhere else 
broker.insertClientList(clientEntry); 
}//and clientEntry & cnnHandler go out of scope 

Приложение работает хорошо, но в конце концов он выходит из строя, говоря:

terminate called after throwing an instance of'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> >' 
     what(): tr1::bad_weak_ptr 

Другое примечание. Я отметил деструктор, в котором приложение сбой. Если бы я не вошел в std :: cout, приложение столкнулось бы с ~ session()

Могу ли я узнать, где я делаю это неправильно? и как я могу это решить?

спасибо

ответ

3

Вы никогда не должны вызывает shared_from_this в г-тор.

https://svn.boost.org/trac/boost/ticket/147

Такое поведение является особенностью. Поскольку деструктор уничтожит объект, небезопасно создать для него shared_ptr, так как оно будет оборваться после завершения деструктора.

+0

Или это не так. Также распространенная ошибка при использовании asio. –

+0

@ForEveR нормально, спасибо за это. Затем, как я упомянул в своем вопросе, даже если я удалю строку cout, я все равно пошлю крах. (на самом деле я поставил линию cout, пытаясь найти причину сбоя) – rahman

+0

@rahman Слишком мало информации о сбоях. В этом случае дайте полную информацию о сеансе. – ForEveR

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