0

我有以下代码:

try
{
    HAS::TCPServerSocket servSock(echoServPort);    // Socket descriptor for server
    std::vector<HAS::TCPSocket*> sockets(MAXCONN);
    for (;;)
    {
        try
        {
            if (socketCount < MAXCONN)
            {
                HAS::TCPSocket* sock(servSock.accept());
                sockets.push_back(sock);
                std::thread handler(handleTCPClient, std::ref(sockets[socketCount++]));
                handler.detach();
            }
        }
        catch (...)
        {
            cerr << "Unable to create thread" << endl;
            exit(1);
        }
    }
}

我想跟踪有限数量的连接(MAXCONN=4),并希望使用std::vector. 不知何故,当我使用上面的代码时,sock变量被正确设置为当前套接字,被servSock.accept(). 但是,当我尝试将sock变量推到 sock 对象上时,std::vector我松开了 sock 对象。

我觉得这与正确指定复制和/或移动构造函数有关,但我已经定义了两者(并使用断点查看何时调用),但它们似乎根本没有被调用。

4

2 回答 2

4

当您说 时,对向量元素的引用无效push_back。你不能以你的方式使用代码。您必须首先填充整个向量,然后再不要触摸它。或者,使用一个容器,其元素引用不会因容器突变而失效(或list出于一般目的,在末端插入/删除)。multisetunordered_multisetdeque

或者只是将指针的副本传递给线程?!

于 2012-09-07T12:40:10.187 回答
2
std::vector<HAS::TCPSocket*> sockets(MAXCONN);
...
sockets.push_back(sock);
std::thread handler(handleTCPClient, std::ref(sockets[socketCount++]));

这段代码看起来很有趣。该向量将包含 4 个空指针,然后是在push_back()调用末尾添加的实际指针。然后线程将获得对第一个空指针的引用,而不是您想要的实际指针。

您可以做以下两件事之一:我的建议是使用向量的默认构造函数,然后调用reserve()以保证不会发生使迭代器无效的重新分配push_backs。那将解决问题。或者,您可以使用元素创建向量,但不要调用push_back()而是使用operator[]来修改 position 处的元素socketCount

于 2012-09-07T13:08:19.853 回答