[問題] vector erase out of range error (Done)

作者: s4300026 (s4300026)   2018-08-20 11:27:00
開發平台(Platform): (Ex: Win10, Linux, ...)
win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC 2017
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
#pragma comment(lib,"Ws2_32.lib")
#include <Winsock2.h>
#include <Ws2tcpip.h>
#include <string>
#include <vector>
#include <map>
#include <mutex>
問題(Question):
vector 刪除元素時發生錯誤,最神奇的地方是:
vector 是有正確存放資料
想詢問有什麼特殊情況會發生這樣的事情呢?
且 iterator 也有正確指向資料
餵入的資料(Input):
struct ptr
預期的正確結果(Expected Output):
可以刪除元素
錯誤結果(Wrong Output):
擲回例外狀況
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://pastebin.com/W8eRsbef
補充說明(Supplement):
https://imgur.com/a/2ScWsfO
思考想法:
int main 選擇要擔任 server 或 client, 然後就 getchar() 等關閉.
希望能實現 non-blocking socket recv/ send/ accept
因此採用 thread 和 select 去避免無回應的情況
問題出在當 client 斷線後,我會收到 recv <= 0
那我就要將該 clinet listener 砍除
問題發生在砍除的時候 vector.erease
但砍除前都有抓到 iterator , 因此覺得奇怪
作者: damody (天亮damody)   2018-08-20 11:29:00
iterator erase後本來就會壞掉
作者: bluesoul (忙死你老爸)   2018-08-20 11:41:00
呼叫erase後,不應該++i,因為已經跳到下一個了你傳進去的iterator和使用的是不同的 vectorlistener應該是個reference指向MySocketListener而非object
作者: legendmtg (CLANNAD)   2018-08-20 12:23:00
198行 delete[]你對new[]出來的東西用了delete
作者: LPH66 (-6.2598534e+18f)   2018-08-20 12:47:00
delete 帶中括號寫成 delete[]
作者: sarafciel (Cattuz)   2018-08-20 12:47:00
delete recvBuffer(X)=>delete [] recvBuffer(O)
作者: s4300026 (s4300026)   2018-08-20 13:01:00
好,感謝樓上
作者: bluesoul (忙死你老爸)   2018-08-20 14:19:00
回傳reference或是指標都可以內容是一樣沒錯,但是iterator是不同的
作者: sarafciel (Cattuz)   2018-08-20 14:20:00
研究了一下 應該是bluesoul講的那樣沒錯
作者: bluesoul (忙死你老爸)   2018-08-20 14:20:00
不同containter的iterator不能混用
作者: sarafciel (Cattuz)   2018-08-20 14:21:00
你看到的記憶體位置是MySocketStruct *指到的位置79行的listener也必須是reference或指標
作者: s4300026 (s4300026)   2018-08-20 17:48:00
可是79行是宣告耶...
作者: sarafciel (Cattuz)   2018-08-20 17:58:00
想辦法解囉 不然你對listener做assign就還是傳值

Links booklink

Contact Us: admin [ a t ] ucptt.com