1. 程式人生 > >VirtualAlloc的奇怪現象,不知原因

VirtualAlloc的奇怪現象,不知原因

結構體:

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;            ///是否已經完成握手
};