VirtualAlloc的奇怪现象,不知原因

Posted xhzxlqt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;            ///是否已经完成握手
};

 

以上是关于VirtualAlloc的奇怪现象,不知原因的主要内容,如果未能解决你的问题,请参考以下文章

Windows XP - VirtualAlloc() 如何(memoryapi.h 在哪里???)

一段神奇的代码-关于PHP字符变量奇怪现象的解释

一个关于ExecutorService shutdownNow时很奇怪的现象

VirtualAlloc

matplotlib--画图时保存图片空白的问题

Windows Phone 应用程序上 ShakeGesture 库中的奇怪现象