VC编程中,判断野指针

函数声明如下:

BOOL WINAPI IsBadReadPtr(
__in const VOID *lp,
__in UINT_PTR ucb
);

BOOL WINAPI IsBadWritePtr(
__in LPVOID lp,
__in UINT_PTR ucb
);

函数的第一个变量为内存首地址,第二个变量为大小。
使用函数举例如下:
变量 m_p3DPts[i].m_ppImgTgts[j],为指针,但是经过一个函数的调用,有可能为野指针,值不为空,但是直接调用,会导致软件奔溃,这时候,就需要
判断此指针是否有效,使用此函数,即可满足。

//判断是否有无效的指针
if (IsBadReadPtr(m_p3DPts[i].m_ppImgTgts[j],sizeof(CImgTarget*))==TRUE)
{
continue;
}

验证指针是否可读/写。在函数的入口处,经常需要验证指针所指向的内容区域是否可读/写。 通常采用assert(p!= NULL)的检测形式。 但是,指针的值不为空并不代表指针指向了合法可读/写内存。Win32 API提供了函数IsBadReadPtr、IsBadWritePtr、IsBadStringPtr、IsBadCodePtr用来检测指针指向的内存区域是否可读/写。C运行时库提供了_CrtIs ValidPointer、_CrtIsValidHeapPointer等函数,MFC库提供了AfxIsValidAddress、AfxIsValidString函数来完成类似功能。
对基于MFC的程序,ASSERT_VALID宏通过调用重载的AssertValid函数来确定指向CObject派生类对象的指针是否有效。ASSERT_VALID宏主要调用了AfxIsValidAddress函数和CObject派生类对象的AssertValid函数(参考MFC源代码afx.h、objcore.cpp)。

你可能感兴趣的:(C++/VC)