この質問では、私はあなたの問題に対するアドホックな解決策を提案しました:Windowsでのヒープ破損エラーの即時検出。どのように?
new
一般に、とdelete
を次のコードに置き換えることができます。
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);
}
メモリの無効なアクセスを判別します。さらなる議論では、リークの検出と他のメモリエラーの検出のアイデアが見つかります。
new
globalとを呼び出す場合は、グローバル名前空間プレフィックスdelete
を使用できます。::
return ::new(nSize);