new、delete需要注意的一个特性
正常情况new一个数组之后,用delete释放是没有问题的。但是当对new得到的堆区进行越界的写入操作(读操作不会)将会导致delete时出现段错误,无法进行删除。如下面的程序所示:
数组大小只有16,但是我们却访问了下标为20的数组中的元素,数组越界了。
(CRT detected that the application wrote to memory after end of heap buffer)
引用CSDN博主「白夜行的狼」的原创文章中的一段:
我是在做华为的面试题时用到了一个危险函数,导致了越界写入,然后delete失败。那什么是危险函数呢,简单地说 就是有一些字符串处理函数、输入输出流函数,它没有进行越界检测,哪怕被写入数组已经越界仍然会继续写入。 举个例子,比如
char* strcpy(char* dest, char* src);
这个函数是从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,返回dest的指针。如果dest指向的内存没有足够大小去存放src字符串怎么办?strcpy函数可不管这些,它会继续进行复制,霸道的进行越界写入!
现在问题已经很清楚了吧,如果你对了new到的堆使用了危险函数,将导致段错误。当然,如果是直接声明存放在栈区的数组进行这样的越界操作,也会导致如下错误
(Stack around the variable ‘data’ was corrupted)
原文链接:https://blog.csdn.net/u013834525/article/details/82884313