博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++的new、delete需要注意的一点:使用危险函数导致的越界
阅读量:4598 次
发布时间:2019-06-09

本文共 1240 字,大约阅读时间需要 4 分钟。

0. 写在最前面

希望大家收藏:

本文持续更新地址:

这里假设大家都知道怎么用new和delete来进行堆空间的申请和释放。这种错误比较难发现,希望大家引以为鉴。

如果觉得还不错就点个赞,点个关注呗,博主会长期更新自己的学习和收获。

new、delete需要注意的一个特性

正常情况new一个数组之后,用delete释放是没有问题的。但是当对new得到的堆区进行越界的写入操作(读操作不会)将会导致delete时出现段错误,无法进行删除。如下面的程序所示:

//正常操作,delete正常进行,程序运行正常char* data = new char[10];data[N-1] = 0x0;delete[] data;//越界读操作,delete正常进行,程序运行正常,但是不建议进行这种越界操作。char* data = new char[10];char temp = data[N];delete[] data;//越界写入,将导致delete操作失败,程序中断char* data = new char[10];data[N] = 0x0;delete[] data;

(CRT detected that the application wrote to memory after end of heap buffer)

 C语言自带的危险函数

我是在做华为的面试题时用到了一个危险函数,导致了越界写入,然后delete失败。那什么是危险函数呢,简单地说就是有一些字符串处理函数、输入输出流函数,它没有进行越界检测,哪怕被写入数组已经越界仍然会继续写入。举个例子,比如

char* strcpy(char* dest, char* src);

这个函数是从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回dest的指针。如果dest指向的内存没有足够大小去存放src字符串怎么办?strcpy函数可不管这些,它会继续进行复制,霸道的进行越界写入!

现在问题已经很清楚了吧,如果你对了new到的堆使用了危险函数,将导致段错误。当然,如果是直接声明存放在栈区的数组进行这样的越界操作,也会导致如下错误

(Stack around the variable ‘data’ was corrupted)

另外再说一个比较奇葩的情况: 

scanf("%x", data);//16进制输入

该函数是默认输入一个int型的数的,而不是像cin那样自动检测数据类型?比如输入“0x01”,该函数将会直接修改4个字节而不是只修改一个字节(我这里是64位机器)。

//data[0] = 0x01
//data[1] = 0x00
//data[2] = 0x00
//data[3] = 0x00

我写代码的时候就是在这里被坑了~~~~导致了数组越界。

 

转载于:https://www.cnblogs.com/HaoQChen/p/11048606.html

你可能感兴趣的文章
java面向对象中的关键字
查看>>
网络类型IPv4和IPv6什么意思?区别?
查看>>
6周学习计划,攻克JavaScript难关(React/Redux/ES6 etc.)
查看>>
大对象堆及.NET垃圾回收器的改进
查看>>
utf-8引发的页面空白
查看>>
MicroPHP 2.2.0 发布
查看>>
Mysql 语句
查看>>
setState 和 bloc 是仇家
查看>>
jmeter之IP欺骗
查看>>
Ubuntu配置OpenStack 二:配置时间同步NTP和安装数据库Maridb以及问题总结
查看>>
zepto源码--compact、flatten、camelize、dasherize、uniq--学习笔记
查看>>
MyCat:开源分布式数据库中间件
查看>>
递归方法,多维变一维数组
查看>>
#pragma once
查看>>
oracle 触发器
查看>>
通用存储过程(二)
查看>>
CleanAop使用笔记
查看>>
OpenJudge计算概论-四大湖
查看>>
【转】算法基础(二):栈的应用 --- 迷宫解题
查看>>
【转】div弹出窗口的制作
查看>>