我正在編程一個多線程的c + + WIN套接字服務器,我遇到了一些奇怪的問題。向量迭代和刪除
我正在使用矢量來存儲活動連接。我用win mutex鎖定向量,然後嘗試遍歷它以查找所有關閉的連接並刪除它們,然後釋放互斥鎖。
代碼:
if (!m_activeConnections.empty()){
for(std::vector<Connection*>::iterator it = m_activeConnections.begin(); it != m_activeConnections.end(); ++it) {
if ((*it)->isClosed()){
delete *it;
it = m_activeConnections.erase(it);
break;
}
}
cout << "\n \t Active Connections: " << m_activeConnections.size() << endl;
}
它是這樣工作的,但是當我刪除break
線總是去與迭代it
指向一個更在循環和值爲0xAAAAAA拋出異常。如果這個刪除是在創建新連接的同一個線程中完成的,即使沒有中斷,它也可以正常工作。爲什麼是這樣?
哦,謝謝你,我是一個C++初學者。我習慣於Java,並沒有注意到這一點。謝謝。 – jack 2015-04-02 00:00:50
實際上,如果目標是同時刪除該項目並刪除該項目,那麼'remove_if'將無法在這裏工作。如果要使用算法方法,則首先使用'std :: stable_parttion',然後'刪除'並擦除分區「壞」一側的項目。 – PaulMcKenzie 2015-04-02 00:35:53
@PaulMcKenzie:好點,我更新了答案! – 2015-04-02 07:43:43