У меня есть следующие классы:повышение :: 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()
Могу ли я узнать, где я делаю это неправильно? и как я могу это решить?
спасибо
Или это не так. Также распространенная ошибка при использовании asio. –
@ForEveR нормально, спасибо за это. Затем, как я упомянул в своем вопросе, даже если я удалю строку cout, я все равно пошлю крах. (на самом деле я поставил линию cout, пытаясь найти причину сбоя) – rahman
@rahman Слишком мало информации о сбоях. В этом случае дайте полную информацию о сеансе. – ForEveR