私は次のクラスを持っています:
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() のあたりでクラッシュします。
どこが間違っているのかわかるでしょうか?どうすれば解決できますか?
ありがとうございました