Класс освобождается сразу после помещения в unique_ptr

Сейчас я работаю на сервере, используя Poco Net & Reactor Pattern. Я наблюдал, чтобы сделать класс 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();
        }
    }
}

И после этого приложение освобождает этот класс мгновенно (это можно увидеть, нажав "Отключить" в журнале сервера).

Что там не так? Благодарю.

1 ответ

Решение
std::unique_ptr<CSConnection> autoptr(this);

После выхода из конструктора он пытается удалить this и вызов деструктора. в данном случае нецелесообразно использовать удаленный объект после его создания.

Самоубийство (delete this) встречается редко и имеет специальное использование, например, в объектах с подсчетом ссылок.

Другие вопросы по тегам