我使用Poco Net& amp;反应堆模式。 我看到要做类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();
}
}
}
在该应用程序之后立即释放该类(可以通过服务器日志中的“Disconnect”观察)。
有什么问题? 感谢。
答案 0 :(得分:3)
std::unique_ptr<CSConnection> autoptr(this);
离开构造函数后,它尝试删除this
并调用析构函数。在这种情况下构造它之后使用已删除的对象是未定义的行为。
自杀(delete this
)很少见且有特殊用途,例如在参考计数物体中。