我在@constm中看到下面的代码回答了这个问题,
Most efficient replacement for IsBadReadPtr?
bool IsBadReadPtr(void* p)
{
MEMORY_BASIC_INFORMATION mbi = {0};
if (::VirtualQuery(p, &mbi, sizeof(mbi)))
{
DWORD mask = (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY);
bool b = !(mbi.Protect & mask);
// check the page is not a guard page
if (mbi.Protect & (PAGE_GUARD|PAGE_NOACCESS)) b = true;
return b;
}
return true;
}
我在Visual Studio 2013中使用Windows和编码。代码看起来很好,我可以看到它将克服isBadReadPtr
访问页面保护的问题,但我想了解它会如何克服了多线程的问题?
此代码是isBadReadPtr
的良好替代品吗?同样看起来这段代码应该返回false
让我理解我传递的ptr
是有效的。
另外,如果我传递一个类的对象,它如何知道对象的大小并检查整个空间?也许我不太了解VirtualQuery。
如果我理解的是正确的,请告诉我。
TIA!