眠れません!:)
Windows でかなり大きなプロジェクトを実行しており、ヒープ破損の問題が発生しました。この素敵なトピックを含むすべての SO を読みました:ヒープ破損エラーをデバッグするには? 、しかし、すぐに使用できるものは何もありませんでした。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);
}
いくつかのヒープ破損エラーが明らかになり、修正することができました。終了時に Debug CRT 警告が表示されなくなりました。ただし、このハックに関していくつか質問があります。
1.誤検知を引き起こす可能性はありますか?
2.ヒープの破損を見逃すことはありますか? (malloc/realloc/free を置き換えても?)
3. 32 ビットでは実行できOUT_OF_MEMORY
ず、64 ビットでのみ実行されます。32ビットの仮想アドレス空間を使い果たしただけでいいのでしょうか?