C++中new的越界访问问题
2019/7/10 22:59:34
本文主要是介绍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++中new的越界访问问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升