最近在写网络上的东西,程序经过长时间的运行,会出现崩溃的问题,经过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
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++ 中判断非空的错误指针的更多相关文章

  1. Java中判断非空对象.

    Java中经常会遇到判断非空的时候. 有的时候判断了非空但是还是报空指针,为什么.? 判断的时候一般都会判断两次.类似于: Org o = new Org(); if ( o.getId()!=nul ...

  2. javascript判断非空

    /* *判断非空 * */ function isEmpty(val){ if(val == null)return true; if(val == undefined || val == 'unde ...

  3. JavaScript如何判断非空

    JavaScript判断非空的语句一般为: var elvis; if (typeof elvis !== "undefined" && elvis !== nul ...

  4. Mybatis if test 中int判断非空的坑

    Mybatis 中,alarmType 是int类型.如果alarmType 为0的话,条件判断返回结果为false,其它值的话,返回true. <if test="alarmType ...

  5. JS中if判断 非空即为真 非0即为真

    1.字符串参与判断时:非空即为真判断字符串为空的方法if(str!=null && str!=undefined && str !='')可简写为if(!str){   ...

  6. oracle中判断"非"

    在oracle中判断为"非"最常见的两种情况,一个是"不等于",一个的"非空". 通过查找资料得知,oracle中判断不等于的方法有好多种: ...

  7. Oracle中验证非空的函数NVL(),NVL2()总结

    1.NVL()函数 NVL函数的格式如下: NVL(expr1,expr2) 含义是:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值. 2 N ...

  8. 关于C++中的非静态类成员函数指针

    昨天发现了一个问题,就是使用对类中的非静态成员函数使用std::bind时,不能像普通函数一样直接传递函数名,而是必须显式地调用&(取地址),于是引申出我们今天的问题:非静态类成员函数指针和普 ...

  9. Javascript 中的非空判断 undefined,null, NaN的区别

    JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS  的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是 ...

随机推荐

  1. mysql5.7版本免安装配置教程

    自己花了两天时间才搞清楚,希望对新手有一定帮助,有问题可以联系哦! mysql分为安装版本msi,免安装要压缩版本ZIP,下载网址:http://dev.mysql.com/downloads 免安装 ...

  2. JS判断移动设备最佳方法

    最实用的还是下面这个: 方法一:纯JS判断 使用这方法既简单,又实用,不需要引入jQuery库,把以下代码加入到<head>里即可. <script type=”text/javas ...

  3. poj 2431 Expedition

    Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12980   Accepted: 3705 Descr ...

  4. DevExpress gridView 小结(一)

    一:第一列显示行号  CustomDrawRowIndicator this.gridViewDevice.IndicatorWidth = 40; this.gridViewDevice.Custo ...

  5. Java Thread and runnable

    java中可有两种方式实现多线程, 一种是继承Thread类,(Thread本身实现了Runnable接口,就是说需要写void run 方法,来执行相关操作) 一种是实现Runnable接口 sta ...

  6. linux 神器之wget

    1.什么是Wget? 首页,它是网络命令中最基本的.最好用的命令之一; 文字接口网页浏览器的好工具. 它(GNU Wget)是一个非交互从网上下载的自由工具(功能).它支持http.ftp.https ...

  7. centos6.4下安装freetds使php支持mssql

    centos版本:6.4 php版本5.3.17 没有安装之前的情况:nginx+php+mysql+FPM-FCGI 接下来安装步骤如下: 1.打开http://www.freetds.org/,进 ...

  8. Spark Streaming揭秘 Day7 再探Job Scheduler

    Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...

  9. select 函数实现 三种拓扑结构 n个客户端的异步通信 (完全图+线性链表+无环图)

    一.这里只介绍简单的三个客户端异步通信(完全图拓扑结构) //建立管道 mkfifo open顺序: cl1 读 , cl2 cl3 向 cl1写 cl2 读 , cl1 cl3 向 cl2写 cl3 ...

  10. Oracle的rownum原理

    Oracle中,按特定条件查询前N条记录,用个rownum就搞定了: SQL> select * from dept where rownum<3; 而对rownum用"> ...