1

現在、Poco Net と Reactor パターンを使用してサーバーで作業しています。クラス オブジェクトはワーカー スレッド プールを参照しているため、class CSConnection 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();
        }
    }
}

その後、アプリケーションはそのクラスを即座に解放します (サーバーログの「切断」で確認できます)。

何が間違っていますか?ありがとう。

4

1 に答える 1

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

コンストラクターから出た後this、デストラクタを削除して呼び出しようとします。この場合、削除されたオブジェクトを構築後に使用するのは未定義の動作です。

自殺 ( delete this) はまれであり、参照カウント オブジェクトなどで特別な用途があります。

于 2013-11-09T18:30:57.380 に答える