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 [中]

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

  返回值

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

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

  如果应用程序在调试器下运行,进程不具有写访问权限在指定的内存范围内的所有字节,该函数会导致第一次机会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));

时间: 2024-08-06 10:47:11

C++ 中判断非空的错误指针的相关文章

填充Excel表中上方非空单元格数据的方法

填充Excel表中上方非空单元格数据的方法   1.选择范围 将需要填写的空单元格以及其上方单元格一起选中 2.定位空值 同时按住ctrl+G,跳出"定位"对话框,点击"定位条件" 在弹出的"定位条件"对话款,选中"空值',并确定,这样,空白单元格全被选中 3.输入公式 输入"="和第一个空单元格上方单元格的地址(A2),如下图,输入完成后,同时按住ctrl+enter,即可

在Word 2010中筛选非空字段收件人记录

在Word 2010文档中进行邮件合并时,有时只需选择特定字段非空的收件人作为合并对象.例如只选择"职务"字 段含有内容的收件人,操作步骤如下所述: 第1步,打开Word 2010文档窗口,切换到"邮件"功能区.在"开始邮件合并"分组中单击"编 辑收件人列表"按钮,如图2011080401所示. 图2011080401 单 击"编辑收件人列表"按钮 小提示:如果"编辑收件人列表"按钮不可

在Word2010中筛选非空字段收件人记录

在Word2010文档中进行邮件合并时,有时只需选择特定字段非空的收件人作为合并对象.例如只选择"职务"字段含有内容的收件人,操作步骤如下所述: 第1步,打开Word2010文档窗口,切换到"邮件"功能区.在"开始邮件合并"分组中单击"编辑收件人列表"按钮,如图1所示. 电脑教程 图1 单击"编辑收件人列表"按钮小提示:如果"编辑收件人列表"按钮不可用,则需要在"开始邮件合并&

新增非空约束字段在不同版本中的演进

开发提了一个数据库变更需求,新增一字段,没有NOT NULL非空约束,但有默认值为NULL.看起来有些奇怪,因为若字段允许NULL,其默认值就是NULL,不用显示声明,可以创建一个无DEFAULT NULL的新增字段再查看desc表结构,就可以证明这点. 基于这问题,引申出的NOT NULL字段问题还有不少,也是比较容易忽视的一些细节,例如杨长老最近连续发表过两篇关于NOT NULL字段的文章确实很有启发, 非空字段空值对查询的影响 http://yangtingkun.net/?p=1481

Groovy Tip 3:如何在if条件语句中判断对象为空

在Java语言编程中,对对象的非空判断是一个永恒的话题.例如,我们经常需要对一个字 符串进行如下的判断: if(str!=null&&!str.equals("")) { ...... } 输入这样的语句的确使人生厌,而且有时候还会忘掉输入"!str.equals ("")"语句中的"!"导致代码出现逻辑错误. 而敏捷的Groovy语言开发就不需要我们担心这样的问题.同样的判断语句,我们只需要输 入下面的代码:

Groovy Tip 4:对象非空判断及“?”运算符

对于一个Domain类对象,如下面的例子: class Empl { String name } 我们需要对它进行操作,比如打印"name"属性的值,我们首先要对它进行非 空判断,如下: def em if(em) { println"name: $em.name" } em = new Empl() em.name = 'Tom' if(em) { println"name: $em.name" } 很显然,如果不做非空判断,那么在第一个pri

js中判断用户输入的值是否为空的简单实例

 本篇文章主要是对js中判断用户输入的值是否为空的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 在js中判断用户输入的值是否为空,这是大家用得非常多的. 这没有什么好写的. 而我却写了. 原因只是自以为是的认为我的这些代码写得不错, 供大家参考一下.   这是摘自的我一个项目的中的用户注册页面.对于大多数人来说,这都几乎是100%经历过的. 贴代码吧,这些代码都是用js写的. 不难,很容易看懂. 看的时候,只要区别两个js类就行了. 前台页面代码:reguser.aspx  

数据库-vb.net提示未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。

问题描述 vb.net提示未能启用约束.一行或多行中包含违反非空.唯一或外键约束的值. 图片说明图片说明图片说明图片说明 解决方案 就是这个字段是唯一的.或者不能为空的.或者指向的外键必须存在等等,但是你插入的数据不满足. 解决方案二: 实在找不出问题在哪里了,麻烦你给看看吧,我上传了4张截图 解决方案三: 看你2,3两个图后,你完全没有数据验证 name,remark,mon没判断是否为空,date不是日期格式,mon是否可以转换成int,还有字符串长度判断

select-php网页中查询非0或者非空结果的同时显示其字段名

问题描述 php网页中查询非0或者非空结果的同时显示其字段名 表名是2014: select * from `2014` where username= 4 得到一行结果后,怎么样才能取得非空的集合,像这样的,而不是连空值也显示出来.不要以固定的形式显示,要根据内容来显示字段. 解决方案 两种处理方案!一种是取出结果集,遍历的时候做判断如果空的则0跳过!第二种是查询数据库的时候按相应的列去做非空的判断!比如 username<>''或者username <> null! 不知道解决