1

私は次のクラスを持っています:

    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() のあたりでクラッシュします。

どこが間違っているのかわかるでしょうか?どうすれば解決できますか?

ありがとうございました

4

1 に答える 1