2013-11-09 37 views
1

我正在使用Poco Net的服務器上當前工作&反應堆模式。 我發現類CSConnection unique_ptr是因爲類對象被引用到工作線程池。將類放入unique_ptr後立即釋放類

構造:

CSConnection::CSConnection(StreamSocket& socket, SocketReactor& reactor) : _socket(socket), _reactor(reactor) 
    { 
std::unique_ptr<CSConnection> autoptr(this); 
     app.logger().information("Connection : " + _socket.peerAddress().toString()); 
     _reactor.addEventHandler(_socket, NObserver<CSConnection, ReadableNotification>(*this, &CSConnection::onReadable)); 
     _reactor.addEventHandler(_socket, NObserver<CSConnection, ShutdownNotification>(*this, &CSConnection::onShutdown)); 
     _reactor.addEventHandler(_socket, NObserver<CSConnection, ErrorNotification>(*this, &CSConnection::onError)); 
     _socket.setBlocking(false); 
     sendSync(); 
    } 

析構函數:

CSConnection::~CSConnection() 
{ 
    app.logger().information("Disconnect : " + _socket.peerAddress().toString()); 
    _reactor.removeEventHandler(_socket, NObserver<CSConnection, ReadableNotification>(*this, &CSConnection::onReadable)); 
    _reactor.removeEventHandler(_socket, NObserver<CSConnection, ShutdownNotification>(*this, &CSConnection::onShutdown)); 
    _reactor.removeEventHandler(_socket, NObserver<CSConnection, ErrorNotification>(*this, &CSConnection::onError)); 
    if(player) 
    { 
     player->relase(); 
     if(player->hasActiveCharacter()) 
     { 
      player->getActiveCharacter()->leaveGameWorld(); 
      player->nullActive(); 
     } 
    } 
} 

而且該應用程序後釋放該類瞬間(可以通過 「斷開」 在服務器日誌中觀察到)。

有什麼問題嗎? 謝謝。

+0

@BartekBanachewicz他沒有使用auto_ptr! –

+0

'unique_ptr'不是'auto_ptr';相似但更好。在構造函數的結尾,你的'autoptr'變量被銷燬並刪除'this'。很確定這不是你想要的。 –

+0

你有沒有考慮過使用函數? –

回答

3
std::unique_ptr<CSConnection> autoptr(this); 

走出它試圖刪除this構造和調用析構函數後。這是未定義的行爲在構造它之後使用已刪除的對象。

自殺(delete this)很少見,並有特殊用法,例如引用計數的對象。

+0

Ymm,但poco的套接字接受器只是通過new創建純指針。 – user2971678

+1

@ user2971678所以如果你喜歡,管理*那*指針與一個智能指針 - 而不是'this' :) – melak47

相關問題