VC编程中,判断野指针

本文介绍如何使用Win32API中的IsBadReadPtr和IsBadWritePtr函数来验证指针的有效性,确保指针指向的是合法可读写的内存区域。此外,还讨论了其他库提供的类似功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数声明如下:

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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值