[问题] 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