不知道是什么具体的原因,望知情者告知
网络采用Iocp模型,每个新创建的socket关联到完成端口(每个socket在创建的时候也申请相应的内存作为上下文信息),并在工作线程中等待网络事件的发生。如果用户想主动关闭socket,则在关闭后也释放相应为保存上下文信息的内存空间。在关闭socket时,简单代码:
closesocket(sk);
::Sleep(10);//如果拿掉这句,有可能会有问题
delete pSocketContext;
问题就出在这,如果关闭socket后,没有Sleep(),马上释放内存,有可能系统会在关闭之后写已释放的内存。因为在pSocketContext中,其中有一个为OVERLAPPED的结构,是在WSARecv(...)时的投递所用的指针。
现在不解的是:有些时候,在closesocket()后,如没有加入Sleep()马上释放内存,系统还是会写上下文所在的OVERLAPPED结构的内存。这样就导致写入的内存空间为非法了。本人通过调试,发现了这种问题,在释放内存时,就可能会现出"User breakpoint called from 0x?????"
有什么方法可以解决???那位遇到过这种问题。