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

Я работаю в настоящее время на сервере, используя Poco Net & Реактор
Я наблюдал, чтобы сделать класс 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) встречается редко и имеет специальное использование, например, в объектах с подсчетом ссылок.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector