VirtualAlloc的奇怪現象,不知原因
阿新 • • 發佈:2019-01-06
結構體:
struct ClientContext { SOCKET m_Socket; ///Socket char m_IP[20]; ///IP WORD nPort; ///埠 // Store buffers CLeesBuffer m_ReadBuffer; ///讀BUFFER CLeesBuffer m_WriteBuffer;///寫BUFFER // Input Elements for Winsock WSABUF m_wsaInBuffer; ///socket 讀緩衝 BYTE m_byInBuffer[SOCKET_BUFFERSIZE]; ///讀緩衝 // Output elements for Winsock WSABUF m_wsaOutBuffer; HANDLE m_hWriteComplete; HANDLE m_hDisconnect;// Message counts... purely for example purposes LONG m_nMsgIn; LONG m_nMsgOut; OVERLAPPEDPLUS* pOverlap_ioRead; OVERLAPPEDPLUS* pOverlap_ioWrite; OVERLAPPEDPLUS* pOverlap_ioInit; OVERLAPPEDPLUS* pOverlap_ioIdle; CTime m_tLastActiveTime;//以下為使用者邏輯部分 BOOL m_bIsHandShaked; ///是否已經完成握手 };
其中CLeesBuffer是在前人(CBuffer)的基礎上修改的記憶體管理類。
如果像上面這樣用,會出問題:
兩個例項在CLeesBuffer中VirtualAlloc申請的記憶體地址,會相同(Win10 64X VS2017)。多次跟蹤,結果相同。VirtualQuey查詢結果:
。。。。。。。。。。。。。 07:05:50.725 CLeesBuffer.ReAllocateBuffer 【Before MEM_COMMIT】 (ThreadID:0x00003afc this=0x03145800) nNowSize=28 pNewBuf=0x00d00000 memInfo.BaseAddress= 0x00d00000 memInfo.AllocationBase= 0x00d00000 memInfo.AllocationProtect=0x00000001 memInfo.RegionSize= 0x00001000 memInfo.State= 0x00002000 memInfo.Protect= 0x00000000 memInfo.Type= 0x00020000 07:05:50.725 CLeesBuffer.ReAllocateBuffer MEM_COMMIT (ThreadID:0x00003afc this=0x03145800) nNowSize=28 pNewBuf=0x00d00000 memInfo.BaseAddress= 0x00d00000 memInfo.AllocationBase= 0x00d00000 memInfo.AllocationProtect=0x00000001 memInfo.RegionSize= 0x00001000 memInfo.State= 0x00001000 memInfo.Protect= 0x00000004 memInfo.Type= 0x00020000 07:05:50.725 (this=0x03145800)VirtualAlloc(MEM_COMMIT):m_pBase=0x00000000 pNewBuf=0x00d00000
【在此故意延遲100ms】也是同樣結果
07:05:50.828 (this=0x03146040)VirtualAlloc:m_pBase=0x00000000 pNewBuf=0x00d10000 07:05:50.828 CLeesBuffer.ReAllocateBuffer 【Before MEM_COMMIT】 (ThreadID:0x00003afc this=0x03146040) nNowSize=28 pNewBuf=0x00d00000 memInfo.BaseAddress= 0x00d00000 memInfo.AllocationBase= 0x00d00000 memInfo.AllocationProtect=0x00000001 memInfo.RegionSize= 0x00001000 memInfo.State= 0x00002000 memInfo.Protect= 0x00000000 memInfo.Type= 0x00020000 07:05:50.829 CLeesBuffer.ReAllocateBuffer MEM_COMMIT (ThreadID:0x00003afc this=0x03146040) nNowSize=28 pNewBuf=0x00d00000 memInfo.BaseAddress= 0x00d00000 memInfo.AllocationBase= 0x00d00000 memInfo.AllocationProtect=0x00000001 memInfo.RegionSize= 0x00001000 memInfo.State= 0x00001000 memInfo.Protect= 0x00000004 memInfo.Type= 0x00020000 。。。。。。。。。。。
後來改為指標,用new來例項,就沒問題了
struct ClientContext { SOCKET m_Socket; ///Socket char m_IP[20]; ///IP WORD nPort; ///埠 // Store buffers CLeesBuffer* m_pReadBuffer; ///讀BUFFER CLeesBuffer* m_pWriteBuffer; ///寫BUFFER // Input Elements for Winsock WSABUF m_wsaInBuffer; ///socket 讀緩衝 BYTE m_byInBuffer[SOCKET_BUFFERSIZE]; ///讀緩衝 // Output elements for Winsock WSABUF m_wsaOutBuffer; HANDLE m_hWriteComplete; HANDLE m_hDisconnect; // Message counts... purely for example purposes LONG m_nMsgIn; LONG m_nMsgOut; OVERLAPPEDPLUS* pOverlap_ioRead; OVERLAPPEDPLUS* pOverlap_ioWrite; OVERLAPPEDPLUS* pOverlap_ioInit; OVERLAPPEDPLUS* pOverlap_ioIdle; CTime m_tLastActiveTime; //以下為使用者邏輯部分 BOOL m_bIsHandShaked; ///是否已經完成握手 };