简单的Poco TCP网络应用核心转储

Simple Poco TCP networking application core dumping

我目前正在研究 Poco 并尝试构建一个简单的 TCP 服务器-客户端应用程序。
本例中 Client 的唯一任务是将所有接收到的数据回显给发送方。
如果我执行已编译的应用程序,退出时会收到以下消息:

*** Error in `./gameserver': free(): invalid pointer: 0x00007ffd4896cbf8 ***
Aborted (core dumped)

我不太明白这里的问题。我认为这与代码的 Poco 部分有关,我在使用 Poco 时遗漏了一些重要的东西。

如果有人能告诉我我的代码有什么问题,那就太好了。

代码:

class Client : public TCPServerConnection
{
public:
    explicit Client(const StreamSocket &socket)
        : TCPServerConnection(socket)
    {
    }

    ~Client()
    {
        socket().close();
    }

    void run()
    {
        char buffer[256];
        int n = socket().receiveBytes(buffer, 256);
        while(n > 0)
        {
            socket().sendBytes(buffer, n);
            n = socket().receiveBytes(buffer, 256);
        }
    }
};

class Factory : public TCPServerConnectionFactory
{
public:
    TCPServerConnection* createConnection(const StreamSocket &socket)
    {
        return new Client(socket);
    }
};

class Server
{
public:
    explicit Server(const string &endpoint)
        : address(endpoint), socket(address), factory(), server(&factory, socket)
    {
        server.start();
    }

    ~Server()
    {
        server.stop();
    }

private:
    SocketAddress address;
    ServerSocket socket;
    TCPServer server;
    Factory factory;
};

int main()
{
    {
        Server server("localhost:5556");
        cin.get();
    }
}

问题是Factory的双免。 ServerTCPServer 对象都拥有 Factory,因此它们都在使用完后释放它。

解决方法是选择一个,让它拥有工厂,而且只有它拥有工厂。这是一种方法:

class Server
{
public:
    explicit Server(const string &endpoint)
        : address(endpoint), socket(address), server(new Factory(), socket)
    {
        server.start();
    }

    ~Server()
    {
        server.stop();
    }

private:
    SocketAddress address;
    ServerSocket socket;
    TCPServer server;
};