Немедленное обнаружение ошибок повреждения кучи в Windows. Как?

Я не могу спать! :)

У меня достаточно большой проект для Windows, и я столкнулся с некоторыми проблемами с кучей повреждений. Я прочитал все ТАК, включая эту приятную тему:Как отладить ошибки повреждения кучи?Однако ничто не было подходящим, чтобы помочь мне "из коробки".Debug CRT а такжеBoundsChecker обнаружены повреждения кучи, но адреса всегда были разными, а точки обнаружения всегда были далеко от фактической перезаписи памяти. Я не спал до середины ночи и создал следующий хак:

DWORD PageSize = 0;

inline void SetPageSize()
{
    if ( !PageSize )
    {
        SYSTEM_INFO sysInfo;
        GetSystemInfo(&sysInfo);
        PageSize = sysInfo.dwPageSize;
    }
}

void* operator new (size_t nSize)
{
    SetPageSize();
    size_t Extra = nSize % PageSize;
    nSize = nSize + ( PageSize - Extra );
    return Ptr = VirtualAlloc( 0, nSize, MEM_COMMIT, PAGE_READWRITE);
}

void operator delete (void* pPtr)
{
    MEMORY_BASIC_INFORMATION mbi;
    VirtualQuery(pPtr, &mbi, sizeof(mbi));
    // leave pages in reserved state, but free the physical memory
    VirtualFree(pPtr, 0, MEM_DECOMMIT);
    DWORD OldProtect;
    // protect the address space, so noone can access those pages
    VirtualProtect(pPtr, mbi.RegionSize, PAGE_NOACCESS, &OldProtect);
}

Некоторые ошибки повреждения кучи стали очевидными, и я смог их исправить. Больше не было предупреждений об отладке CRT при выходе. Тем не менее, у меня есть несколько вопросов относительно этого хака:

1. Может ли это привести к ложным срабатываниям?

2. Может ли он пропустить некоторые из кучи повреждений? (даже если мы заменим malloc / realloc / free?)

3. Он не может работать на 32-битной сOUT_OF_MEMORYТолько на 64-битных. Я прав, мы просто исчерпали виртуальное адресное пространство на 32-разрядных?

Ответы на вопрос(3)

Ваш ответ на вопрос