C++ 中判断非空的错误指针
2014-02-11 10:27
120 查看
最近在写网络上的东西,程序经过长时间的运行,会出现崩溃的问题,经过DUMP文件的查看,发现在recv的地方接收返回值的时候,数据的长度异常的大差不多16亿多字节.而查看分配后的char指针显示为错误的指针,这可能是接收数据不对应产生的问题解决思路如下:
1.对返回值长度进行判断,如果超过项目内最大的返回值就直接return(比如我项目内的最大返回值为5000,哪么我设定的值为10000);
2.对char指针进行判断,由于这里返回的数据是有的,只是解析不出来而已,这里就是一个非空的错误指针,所以进行二次验证,使用IsBadWritePtr这个API如下实例:
BOOL WINAPI IsBadWritePtr(
_In_ LPVOID LP,
_In_ UINT_PTR UCB
);
参数
LP [中]
一个指向内存块的第一个字节。
UCB [中]
该内存块的大小,以字节为单位。如果这个参数是零,则返回值是零。
返回值
如果调用进程具有写访问指定的内存范围内的所有字节,则返回值为零。
如果调用进程不具有写访问指定的内存范围内的所有字节,则返回值为非零值。
如果应用程序在调试器下运行,进程不具有写访问权限在指定的内存范围内的所有字节,该函数会导致第一次机会STATUS_ACCESS_VIOLATION例外。调试器可以被配置为打破这个条件。恢复执行的过程在调试器中后,该功能将继续像往常一样,并返回一个非零值这个行为是经过设计,并作为辅助调试。
1.对返回值长度进行判断,如果超过项目内最大的返回值就直接return(比如我项目内的最大返回值为5000,哪么我设定的值为10000);
2.对char指针进行判断,由于这里返回的数据是有的,只是解析不出来而已,这里就是一个非空的错误指针,所以进行二次验证,使用IsBadWritePtr这个API如下实例:
BOOL WINAPI IsBadWritePtr(
_In_ LPVOID LP,
_In_ UINT_PTR UCB
);
参数
LP [中]
一个指向内存块的第一个字节。
UCB [中]
该内存块的大小,以字节为单位。如果这个参数是零,则返回值是零。
返回值
如果调用进程具有写访问指定的内存范围内的所有字节,则返回值为零。
如果调用进程不具有写访问指定的内存范围内的所有字节,则返回值为非零值。
如果应用程序在调试器下运行,进程不具有写访问权限在指定的内存范围内的所有字节,该函数会导致第一次机会STATUS_ACCESS_VIOLATION例外。调试器可以被配置为打破这个条件。恢复执行的过程在调试器中后,该功能将继续像往常一样,并返回一个非零值这个行为是经过设计,并作为辅助调试。
//---------------------------------------------------------------------------- //这是一个测试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));
相关文章推荐
- C++中判断非空的错误指针
- C++ 中判断非空的错误指针
- C/C++ 指针的非空判断
- 错误:c++空指针访问virtual成员函数
- 必须先判断对象不为空,否则会报空指针错误。
- 实战c++中的智能指针unique_ptr系列-- 使用std::unique_ptr代替new operator(错误:‘unique_ptr’ is not a member of ‘std’)
- c++中传递字符指针容易犯的错误
- c++ 动态判断基类指针指向的子类类型(typeid)
- 实战c++中的智能指针unique_ptr系列-- 使用std::unique_ptr代替new operator(错误:‘unique_ptr’ is not a member of ‘std’)
- C/C++/CPP中与虚拟存储器(指针)有关错误汇总(一)
- C/C++/CPP中与虚拟存储器(指针)有关错误汇总(二)
- C++学习总结_指针常见错误
- C/C++ 错误笔记-在给结构体中的指针赋值时,要注意该指针是否已指向内存空间
- C/C++ 下如何判断空指针
- C,C++回文字符串判断(字符串指针的用法)
- C/C++ 段错误--关于指针内存泄露
- C++ 判断指针为空的写法
- 实战c++中的智能指针unique_ptr系列-- unique_ptr与lambda的错误结合(尤其是捕获lambda中的unique_ptr)
- C,C++回文字符串判断(字符串指针的用法)
- GetMemory错误讲解(指针练习)----C++面试之GetMemory问题