Bil*_*hon 5 c++ pointers iterator list
好的这次我决定使用STL制作一个列表.我需要为每个客户端创建一个专用的TCP套接字.所以每当我有一个连接时,我实例化一个套接字并在列表中添加一个指向它的指针.
list<MyTcp*> SocketList; //This is the list of pointers to sockets
list<MyTcp*>::iterator it; //An iterator to the list of pointers to TCP sockets.
Run Code Online (Sandbox Code Playgroud)
将一个新指针放到套接字很容易,但是现在每次连接结束时我应该断开套接字并删除指针,这样我就不会有大量的内存泄漏,对吧?好吧..我以为我做得好这个:
it=SocketList.begin();
while( it != SocketList.end() ){
if((*it)->getClientId() == id){
pSocket = it; // <-------------- compiler complains at this line
SocketList.remove(pSocket);
pSocket->Disconnect();
delete pSocket;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
但编译器这样说:
error: invalid cast from type ‘std::_List_iterator<MyTcp*>’ to type ‘MyTcp*’
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?我以为我做的事情是对的,在任何给定的时间只是指向集合中的一个元素不是迭代器?我该怎么解决?
Ecl*_*pse 18
试试这个:
pSocket = *it;
Run Code Online (Sandbox Code Playgroud)
迭代器的行为很像指针,但实际上它们可以是一个指针,也可以是一个完全成熟的类.在这种情况下,重要的是,当你取消引用一个时,你得到容器中存储的任何项目.由于您将MyTcp*s 存储在列表中,因此当您取消引用迭代器时,您会得到一个MyTcp*. pSocket是类型,MyTcp*所以上面的赋值成功.您尝试执行的任务不是取消引用迭代器 - 您正在尝试将迭代器本身分配给pSocket.
这有点像以下情况:
void foo()
{
MyTcp *array[10]; // An array full of MyTcp pointers
MyTcp **iterator = NULL; // pointers make good iterators for arrays (but not for std::lists)
for (iterator = array; iterator != array + 10; ++iterator)
{
// This fails to compile (cannot assign MyTcp** to MyTcp*:
MyTcp *wrong = iterator;
// This succeeds:
MyTcp *current = *iterator; // important to dereference the iterator
}
}
Run Code Online (Sandbox Code Playgroud)