重复使用memcpy / memmove崩溃

时间:2016-05-05 14:28:08

标签: c++

所以我有这个小代码,它循环通过内存区域,将它们保存到一个字节数组,然后使用它,最后删除它(解除分配它)。这一切都发生在非主线程中,因此使用CriticalSections。

代码如下所示:

SIZE_T addr_min = (SIZE_T)sysInfo.lpMinimumApplicationAddress;
SIZE_T addr_max = (SIZE_T)sysInfo.lpMaximumApplicationAddress;

while (addr_min < addr_max)
{
    MEMORY_BASIC_INFORMATION mbi = { 0 };
    if (!::VirtualQueryEx(hndl, (LPCVOID)addr_min, &mbi, sizeof(mbi)))
    {
        continue;
    }

    if (mbi.State == MEM_COMMIT && ((mbi.Protect & PAGE_GUARD) == 0) && ((mbi.Protect & PAGE_NOACCESS) == 0))
    {

        SIZE_T region_size = mbi.RegionSize;
        PVOID Base_Address = mbi.BaseAddress;

        BYTE * dump = new BYTE[region_size + 1];

        EnterCriticalSection(...);

        memset(dump, 0x00, region_size + 1);

        //this is where it crashes, same thing with memcpy
        //Access violation reading "dump"'s address:
        //memmove(unsigned char * dst=0x42aff024, unsigned char * 
        //src=0x7a768000, unsigned long count=1409024)

        std::memmove(dump, Base_Address, region_size); 

        LeaveCriticalSection(...);

        //Do Stuff with dump, that only involves reading from it

        if (dump){
            delete[] dump;
            dump = NULL;
        }
    }
    addr_min += mbi.RegionSize;

}

代码在大多数情况下都能正常工作。但有时它只是在memcpy / memmove中崩溃。在Visual Studio Debugger下,它显示崩溃是因为读取“dump”时出错,如果我只是为它定义和分配内存,那怎么可能呢。谢谢!

另外,可能是因为内存可以在memcpy中间发生变化吗?

0 个答案:

没有答案