最近使用IOCP在搞一個服務器端程序,發現在release編出來的版本運行的時候,由於接收數據過快,出現程序崩潰,儘管release生成調試信息,但堆棧處於不可調試的狀態。而debug情況下不出現這種情況。後來在網上,找了兩天,試了兩天。終於找到方法。
原因是:WSARecv中的Overlap參數不能設置成局部變量,而由於我是在一個函數中定義了一個Overlap局部變量,當WSARecv返回以後,Overlap這個變量是失效了的,而WSARecv中Overlap傳進去的是地址,IOCP在WSARecv返回以後,還需要繼續使用這個參數,而由於局部變量失效,導致程序崩潰,對於沒有碰到過類似問題的人來說非常痛苦(找不到bug所在和崩潰原因)。所以應該在程序運行過程中保持Overlap變量的有效性。