2012-09-07 30 views
0

我有以下代码:无法套接字对象移动到的std ::矢量

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变量推入std::vector时,我松开了袜子物体。

我有一种感觉它与正常指定的副本和/或移动的构造做的,但我已经定义了两个(及使用断点,看的时候会被调用),但他们似乎并没有得到所谓的在所有。

+0

std :: vector 套接字(MAXCONN); 这应该初始化你的矢量的最大尺寸是4? ...这不是如何矢量应该工作。 – Alex

+0

当'socketCount'达到最大大小时,你的程序将只是忙循环。这看起来像一个可怕的想法。另外,什么时候'socketCount'会被减少*? –

+2

'std :: vector 套接字(MAXCONN);'将初始化您的向量以包含四个空指针,它不会对最大大小做任何事情。 –

回答

4

当您说push_back时,对矢量元素的引用无效。您无法按照您的方式使用代码。您必须先填充整个矢量,然后再不要再触摸它。或者,使用其容器基因未因容器突变而无效的容器(listmultisetunordered_multiset用于通用目的,deque用于端部的插入/删除)。

或者只是通过一个副本的指针线程?!

+0

感谢您的帮助; std :: list似乎工作正常。此外,我尝试将指针传递给线程之前 - 我认为这将是最好的方式去做,但我无法得到它的工作。将再次尝试:) – QNimbus

+0

@QNimbus:您的代码有很多其他问题。我不明白为什么传递副本不起作用,这是迄今为止最简单和最合适的解决方案。 –

+1

@QNimbus:考虑到最后一行中的建议,因为它比答案的其余部分要好。你持有一个指向套接字的指针,只是*复制指针,没有必要持有对指针的引用,除非你需要'线程'来修改指针? –

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[]修改位置socketCount上的元素。

相关问题