C++中new的越界访问问题
今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误。
如果犯了和我一样的错,也能知道自己错在哪里! <(^-^)>
函数如下:(斐波那契数列的实现)
long long FibonacciSeq( int n) { long long *fib=new long long[n+1]; fib[0] = 0; fib[1] = 1; for (int i = 2;i <=n; i++) { fib[i] = fib[i - 1] + fib[i - 2]; } long long ret = fib[n]; delete[] fib; return ret; }
上面的程序有BUG,如果传给函数的参数是0,程序就会因为触发一个断点而崩溃。
单步调试,根据内存窗口就会发现问题所在!
fib指向的内存初始化完成后,其的内存情况如上图,我们可以观察到这块内存的前后都有 fd fd fd fd ,0xFD为初始化受保护的内存(debug版在动态分配内存的前后加入保护内存以防止越界访问),而fib[1] = 1;正好把fd fd fd fd 以及它后面的四个字节改为了01 00 00 00 00 000000,如下图:
程序运行到delete[] fib;时只找到了“受保护的内存标志”的起始位置,另外一个“受保护的内存标志”找不到了,所以程序运行会失败!
其实很简单,也就是发生了越界访问!我只new了一块空间,却存了两个变量,当然不行了!
相关推荐
-
浅析C语言编程中的数组越界问题
因为C语言不检查数组越界,而数组又是我们经常用的数据结构之一,所以程序中经常会遇到数组越界的情况,并且后果轻者读写数据不对,重者程序crash.下面我们来分析一下数组越界的情况: 1) 堆中的数组越界 因为堆是我们自己分配的,如果越界,那么会把堆中其他空间的数据给写掉,或读取了其他空间的数据,这样就会导致其他变量的数据变得不对,如果是一个指针的话,那么有可能会引起crash 2) 栈中的数组越界 因为栈是向下增长的,在进入一个函数之前,会先把参数和下一步要执行的指令地址(通过call实现)压栈,
-
c语言算术运算符越界问题解决方案
大量的安全漏洞是由于计算机算术运算的微妙细节引起的, 具体的C语言, 诸如符号数和无符号数之间转换, 算术运算的越界都会导致不可预知的错误和安全漏洞, 具体的案例数不胜数. 作为一个系统程序员, 有必要对这些细节有深入的了解. 本篇参考csapp, 主要介绍如何判断算术运算的越界问题. (虽然本篇的代码经过大量的测试, 但本人仍然无法保证代码的正确性, 希望大家纠错). 讲解的原则是"摆定理, 不证明, 写代码". 具体的证明过程在csapp中有详细的讲解, 也不是太难. 主要使用关键
-
searchDisplayController 引起的数组越界处理办法
下面把searchDisplayController 引起的数组越界处理办法给大家分享如下: 当[searchDisplayController.searchResultsTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone] 时,发送了崩溃 错误提示如下: Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArra
-
C++中new的越界访问问题
今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误. 如果犯了和我一样的错,也能知道自己错在哪里! <(^-^)> 函数如下:(斐波那契数列的实现) long long FibonacciSeq( int n) { long long *fib=new long long[n+1]; fib[0] = 0; fib[1] = 1; for (int i = 2;i <=n; i++) { fib[i]
-
C语言陷阱与缺陷之数组越界访问详解
目录 1.问题引入 2.问题分析 (1)理论分析 (2)调试验证 总结 1.问题引入 一道经典的笔试题来了,请做好准备!!! 试问以下代码在Visual studio 2019环境下执行结果?原因? #include <stdio.h> int main() { int i = 0; int arr[10] = {0}; for(i=0; i<=12; i++) { arr[i] = 0; printf("Hello World!\n"); } return 0; }
-
基于win2003虚拟机中apache服务器的访问
虽然在win2003配置PHP有点非主流,但你还是要会怎么弄.你也可以将本文的虚拟机看成是服务器,宿主机看成是客户端. 不像Linux系统,由于win2003有IIS的存在,占有了固有的80的端口,在win2003虚拟机中配置的apache服务器常常被迫改成其它端口,比如8081,有时候,如果你想在宿主机或者外网访问win2003下配置在apache下的php,可能会出现ping是能ping通,但无法访问的情况. 首先在虚拟机中,通过ipconfig得知虚拟机win2003的IP地址. 然后在宿
-
PHP中关于PDO数据访问抽象层的功能操作实例
PDO:数据访问抽象层 具有三大特点: 1.可以访问其它数据库 所有数据库都可以 2.具有事务功能 3.带有预处理语句功能(防止SQL注入攻击) 实例操作代码如下: <?php //1.造PDO对象 $dsn ="mysql:dbname=mydb;host=localhost";//数据库类型:dbname=数据库名称;host=链接的ip或本机 $pdo =new PDO($dsn,"root","root");//$dsn,帐号,密
-
详解java中通过post方式访问后台服务器
最近在学习java中通过post方式访问后台服务器,那么今天也算个学习笔记吧! 首先,上代码: Runnable payRunnable = new Runnable() { @Override public void run() { try { HashMap<String, String> payParamMap = new HashMap<String, String>(); payParamMap.put("canshu" ,"woshican
-
关于.net(C#)中的跨进程访问的问题
namespace process_image { public partial class jszg_upload : Form { static bool stop_flag = false; public jszg_upload() { InitializeComponent(); } private void upload_button1_Click(object sender, EventArgs e) { stop_flag = false; if (this.checkBox1.C
-
关于C#中ajax跨域访问问题
最近因项目需要,需要跨域请求访问数据.跨域访问是指什么? [跨域]:指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制.所谓同域是指,域名,协议,端口均相同,不明白没关系,举个栗子:例如,我的电脑上有2个服务器 192.168.0.11和192.168.0.12.如果第一个服务器上的页面要访问第二个服务器上面的数据,就叫做跨域.或者http://www.baidu.com 要访问http://www.xxx.com也是不同域名也是跨域.
-
在python中按照特定顺序访问字典的方法详解
最近使用python写一些东西,在参考资料的时候发现字典是没有顺序的,那么怎么样按照一定顺序访问字典呐,我找到了一个小方法: 假设一个字典是: D = {'a': '1', 'b': '2', 'c': '3'} 如果我们要按照a, b, c的顺序访问字典,可以借助一个列表,比如说: L = list(D.keys()) L.sort() for key in L: print(key, 'is' D[key]) 输出为: a is 1 b is 2 c is 3 需要倒序的话只需使用倒序函数排
-
Vue.js 中 axios 跨域访问错误问题及解决方法
1.假如访问的接口地址为 http://www.test.com/apis/index.php (php api 接口) 2.而开发地址为http://127.0.0.1:8080,当axios发起请求时,出现如下错误: Failed to load http://www.test.com/apis/index.php?&act=login: The value of the 'Access-Control-Allow-Origin' headerin the response must no
随机推荐
- Ruby中的gem包管理的使用及gem源搭建教程
- QQ在线状态代码
- 木马下载器前仆后继,AOTU病毒群卷土重来(专杀4月15日升级到1.4版)
- [a] 1 [/a]转换为网址的UBB的正则
- Java简单实现SpringMVC+MyBatis分页插件
- group by,having,order by的用法详解
- php 获取百度的热词数据的代码
- JS实现控制图片显示大小的方法【图片等比例缩放功能】
- DropDownList控件绑定数据源的三种方法
- HTTP 499 状态码 nginx下 499错误的解决办法
- Java中对象的序列化详解及实例
- 详解Android中图片的三级缓存及实例
- java解析xml汇总_动力节点Java学院整理
- 三层交换机的智能流处理技术
- Python测试人员需要掌握的知识
- JS 自执行函数原理及用法
- java多线程读取多个文件的方法
- Django项目中添加ldap登陆认证功能的实现
- ubuntu19系统及以下版本安装android studio的教程
- 基于jQuery的时间戳与日期间的转化