C++中判断非空的错误指针(转)

C++中判断非空的错误指针

最近在写网络上的东西,程序经过长时间的运行,会出现崩溃的问题,经过DUMP文件的查看,发现在recv的地方接收返回值的时候,数据的长度异常的大差不多16亿多字节。而查看分配后的char指针显示为错误的指针,这可能是接收数据不对应产生的问题解决思路如下:

1.对返回值长度进行判断,如果超过项目内最大的返回值就直接return(比如我项目内的最大返回值为5000,哪么我设定的值为10000);

2.对char指针进行判断,由于这里返回的数据是有的,只是解析不出来而已,这里就是一个非空的错误指针,所以进行二次验证,使用IsBadWritePtr这个API如下实例:

BOOL WINAPI IsBadWritePtr(

In LPVOID LP,

In UINT_PTR UCB

);

参数

LP [中]

一个指向内存块的第一个字节。

UCB [中]

该内存块的大小,以字节为单位。如果这个参数是零,则返回值是零。

返回值 www.qcwyo68.com

如果调用进程具有写访问指定的内存范围内的所有字节,则返回值为零。

如果调用进程不具有写访问指定的内存范围内的所有字节,则返回值为非零值。

如果应用程序在调试器下运行,进程不具有写访问权限在指定的内存范围内的所有字节,该函数会导致第一次机会STATUS_ACCESS_VIOLATION例外。调试器可以被配置为打破这个条件??.恢复执行的过程在调试器中后,该功能将继续像往常一样,并返回一个非零值这个行为是经过设计,并作为辅助调试 www.lefeng123.com

//----------------------------------------------------------------------------

//这是一个测试1

char *pbuf1 = new char[10];

pbuf1 = (char *)0x0; //经过这里赋值 pbuf现在是一个错误的指针

bool br1 = IsBadWritePtr(pbuf1,10); //返回的值是true

if(!br1)

{

memcpy(pbuf1,“111111111”,10);

cout 《 pbuf1 《 endl;

printf(“Display1:%s \n”,pbuf1);

}

//这是一个测试2

char *pbuf2 = new char[10];

bool br2 = IsBadWritePtr(pbuf2,10); //返回的值是true

if(!br2)

{

memcpy(pbuf2,“222222222”,10);

printf(“Display2:%s \n”,pbuf2);

}

//输出结果

//Display2:222222222

//----------------------------------------------------------------------------

MFC里也可以使用AfxIsValidAddress方法判断。

// Allocate a 5 character array, which should have a valid memory address.

char *array = new char[5];

// Create a null pointer, which should be an invalid memory address.

char *null = (char *)0x0;

ASSERT(AfxIsValidAddress(array, 5));

ASSERT(!AfxIsValidAddress(null, 5));
原作者地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值