C++的newdelete需要注意的一点:使用危险函数导致的越界CRT detected that the application wrote to memory after end of heap

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++的newdelete需要注意的一点:使用危险函数导致的越界CRT detected that the application wrote to memory after end of heap相关的知识,希望对你有一定的参考价值。

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

以上是关于C++的newdelete需要注意的一点:使用危险函数导致的越界CRT detected that the application wrote to memory after end of heap的主要内容,如果未能解决你的问题,请参考以下文章

线程池使用FutureTask时候需要注意的一点事

内存分区模型以及newdelete操作

Poco 1.4.2 HTTPClientSession/HTTPRequest 使用使用代理(proxy)需要注意的一点

Poco 1.4.2 HTTPClientSession/HTTPRequest 使用使用代理(proxy)需要注意的一点

关于时间复杂度的一点需要注意的地方

捕获异常时的执行顺序需要注意的一点