Debug Assertion Failed _CrtlsValidHeapPointer(block) realloc堆引发的错误

应用场景

二级指针的应用中堆的处理

问题描述:

realloc后出现堆错误

#include"algorithm.h"//数组插入元素
int insert(int **pp ,int &n,int tmp, int pos)
{if (0 <= pos&&pos <= n){int *po = *pp;//保存 旧一级指针int *pn=NULL;//创建一级指针作为新地址//ppcout << "&pp" << "\t" <<&pp<< endl;cout << "pp" << "\t" << pp << endl;cout << "*pp" << "\t" << *pp << endl;cout << "**pp" << "\t" << **pp << endl;printf("\n");//pocout << "&po" << "\t" <<&po << endl;cout << "po" << "\t" << po << endl;cout << "*po" << "\t" << *po << endl;printf("\n");n =20;pn = (int *)realloc(po, n*sizeof(int));//pncout << "&pn" << "\t" << &pn << endl;cout << "pn" << "\t" << pn << endl;cout << "*pn" << "\t" << *pn << endl;printf("\n");pp = &pn;//pp更新后cout << "&pp" << "\t" << &pp << endl;cout << "pp" << "\t" << pp << endl;cout << "*pp" << "\t" << *pp << endl;cout << "**pp" << "\t" << **pp << endl;printf("\n");//int i = n;//while (i > pos)//{//	p[i--] = p[i - 1];//从后往前腾出位置//}//p[pos] = tmp;free(po);return 0;}elsereturn -1;
}int main()
{int n = 9, t, pos = 0;int *p = (int *)malloc(n*sizeof(int));int **pp = &p;scan_arr(p, n);scanf("%d", &t);pos = 6;insert(pp, n, t, pos);}

运行结果:
在这里插入图片描述

原因分析:

报错Expression:_CrtlsValidHeapPointer(block) :这是无效的堆指针,也就是存在堆错误。

free()/delete在一块堆内存的时候会检查堆头,如果堆头有异常,就报堆错误。
对分配的指针不要进行赋值操作了,否则赋值后,再进行free()找不到原来的指针,也会报错。

realloc(p,n)
先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

解决方案:

因为realloc重新分配后,po的会自动释放,因此不要重复释放,去掉free(po)便可。

		...n = 100;pn = (int *)realloc(po, n*sizeof(int));if (pn)//成功分配		{//旧指针最好清零po = NULL;//若改为free(po)释放旧指针会导致指针悬空!!! //free(po);//错误cout << "po" << "\t" << po << endl; cout << endl;}else{printf("内存不足\n");return NULL;}//pncout << "&pn" << "\t" << &pn << endl;cout << "pn" << "\t" << pn << endl;cout << "*pn" << "\t" << *pn << endl;printf("\n");...

若无 po=NULL;而是free(po);则由于po是个野指针(po指向的块其实已被realloc自动释放,只是po并未清零),这时候对po的操作都是对野指针的操作,没有意义并且可能破坏其他内存;
当n=20较小时,realloc采用第一种分配方式,得到结果如图,虽然堆没有报错,但是*pn不正确,说明pn的块在free(po)的时候冲掉了
在这里插入图片描述
当n=100较大时,realloc采用第二种分配方式,运行报错,free(po)会检查堆头,发现po的堆被(realloc自动)释放了,产生堆头错误
在这里插入图片描述
 

因此要使用realloc要特别注意应先判断返回值,再对旧指针清零。

简而言之:free()释放内存并不会将指针置零,可以通过手动置零以免产生野指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

观点 | 李飞飞最新访谈:我每天都在对AI的担忧中醒来

来源&#xff1a;AI科技评论是的&#xff0c;最近这些年&#xff0c;无人机可以说是爆发式发展。以前&#xff0c;它仅用于神秘的军事用途。如今&#xff0c;却在我们的日常生活中见怪不怪。人工智能对人类会产生什么影响&#xff0c;一直是值得讨论的话题&#xff0c;它会更好…

数字图像处理 图像变换

数字图像基础参考资料一、人眼视觉特性二、图像基本知识1.图像类别2.图像输入3.图像输出三、图像处理1.图像类型转化2.图像变换点变换代数运算几何运算参考资料 一、人眼视觉特性 韦伯率:50%概率感觉到亮度变化时的 ΔII\frac{\Delta I}{I}IΔI​为韦伯率。 韦伯-费希纳定律&a…

超乎想象!关于5G无人机的最强科普!

来源&#xff1a;鲜枣课堂/xzclasscom说到无人机&#xff0c;大家一定都非常熟悉。是的&#xff0c;最近这些年&#xff0c;无人机可以说是爆发式发展。以前&#xff0c;它仅用于神秘的军事用途。如今&#xff0c;却在我们的日常生活中见怪不怪。我们身边出现了越来越多的无人机…

相关与卷积、各种误差

相关和卷积相关自相关性质卷积公式物理意义性质相关 自相关 自相关函数就是信号x(t)x(t)x(t)和它的时移信号 x(tτ)x(t\tau )x(tτ) 的乘积平均值。它是时移变量 τ\tauτ 的函数。 “自相关”这种数据处理方法&#xff0c;可以发现隐藏在杂乱信号中的有用信息。这个能力是…

5G全产业链最新解读

来源&#xff1a;中创产业研究院摘要&#xff1a;自5G概念的提出&#xff0c;各国相关技术的研发以及产业布局也在如火如荼进行之中。与此同时我国5G在标准研发上正逐渐成为全球领跑者&#xff0c;有望在2019年实现5G技术的试商用&#xff0c;在2020年实现正式商用。本文将围绕…

函数参数传递、数组指针、二级指针、左值、引用

数组和指针的区别 数组内地址一定连续&#xff0c;指针则不一定连续。数组赋值要么初始化就设定&#xff0c;要么循环元素赋值。而指针随时可以赋值(改变指向)。数组的存储空间&#xff0c;不是在静态区就是在栈上。指针位置随意。sizeof&#xff08;数组名&#xff09; 元素个…

下一个汽车万亿市场打开!氢能源时代正到来

来源&#xff1a;智东西内参看点&#xff1a;中国氢能汽车产业产值有望突破万亿元大关。氢能汽车是以氢为主要能量作为移动的汽车。氢能被视为全球最具发展潜力的清洁能源之一&#xff0c;并被不少国家、车企及学者认为是“终极新能源汽车解决方案”。伴随着汽车保有量持续增长…

高斯噪声和椒盐噪声

clear all;clc;close all; imimread(1.jpg); % oim; [w, h ,z]size(im); imrgb2gray(im); oim;%原图备份 figure;seq0; seqseq1;subplot(2,2,seq);imshow(im);title(原图);posaxis;xlabel(,position,[(pos(1)pos(2))/2 pos(4)]);%高斯噪声 gaunormrnd(0,0.1,w,h); im1im2double…

李彦宏/王坚/王传福等上榜“中国工程院2019院士增选候选人”引争议,实至名归吗?...

来源&#xff1a;物联网智库导 读五一小长假前一天&#xff0c;中国工程院网站公布了2019年工程院院士增选有效候选人名单。经中国工程院主席团审定&#xff0c;最终确定的有效候选人共531位。值得注意的是&#xff0c;BAT微软比亚迪等高管均上榜。此次中国工程院531名候选人的…

号称能自动编程60年,“进化计算”究竟进化到哪一步了?

大数据文摘出品来源&#xff1a;ponderwall编译&#xff1a;stats熊、钱天培大胆想象一下&#xff0c;如果计算机可以自行编写程序&#xff0c;这会为人类带来什么样的变化&#xff1f;与其辛苦研究计算机解决问题的方法论&#xff0c;敲出精准的代码&#xff0c;不如告诉计算机…

动态规划——数塔问题

从原点&#xff08;顶层&#xff09;出发&#xff0c;只能向左或者向右&#xff0c;找到一条路径使得路径上的数字和最大: #include<stdio.h> //#include"algorithm.h" #define N 100int max(int a, int b) {return a > b ? a : b; }int main() {int a[N…

PS填充、仿制图章和修补工具

右下角调整色调后&#xff1a; 概览&#xff1a; 用魔棒工具反选出天空的树枝&#xff0c;然后点 选择-修改-扩展 大致扣出枝丫&#xff0c;再 编辑-填充-内容识别 将空中的树枝ps掉。通过仿制图章工具&#xff08;勾选对齐&#xff09;可以将右下角楼p掉。也可以用修补工具&…

学界 |《nature》杂志:我们有义务搞懂我们所创造出来的技术

来源: AI科技评论一个跨学科的研究小组希望创建一个名为「机器行为」的新学科&#xff0c;以了解人工智能将如何对我们的社会、文化、经济与政治造成影响。在《自然》杂志的一篇评论文章中&#xff0c;作者认为人工智能算法的研究需要扩展到计算机科学以外的领域&#xff0c;纳…

高数复习9.13 函数与极限

双曲正切函数图像 反双曲arsh和arch的表达式 arshxln(xx21)arsh xln(x\sqrt{x^21})arshxln(xx21​)   archxln(xx2−1)arch xln(x\sqrt{x^2-1})archxln(xx2−1​) 数列的极限&#xff1a;构造|xn-a|<一个能确定的数&#xff08;表达式&#xff09; 极限存在的证明&…

【深度】从GE工业互联网到中国工业互联网

来源&#xff1a;数字化企业工业互联网自2017年起已成为国内科技界最为火爆的词汇之一。学者、供应商、投资商、企业家、媒体、政府官员、人大代表、政协委员等纷纷给出了自己的解读。一、背景冠名为工业互联网的学术会议此起彼伏&#xff0c;有世界大会、世界峰会、全球峰会、…

LeetCode题——最长无重复子串

题目 给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。如&#xff1a; 输入: “abcbabcd” 输出: 4 解释: 因为无重复字符的最长子串是 “abcd”&#xff0c;所以其长度为 4。 思路 一开始容易往暴力遍历的方向想&#xff0c;但是实际上运用窗口的…

透视世界人工智能发展

来源&#xff1a;参考消息、新华网摘要&#xff1a;当今世界&#xff0c;随着人工智能迎来新一轮发展热潮&#xff0c;一个“新智能时代”即将到来。世界大国都把加快发展人工智能上升至国家战略高度&#xff0c;以抢占新一轮科技革命和产业变革的制高点。“透视世界人工智能发…

半导体行业必将再火十年!两大趋势成发展新动能

来源&#xff1a;智东西看点&#xff1a;汽车半导体和人工智能芯片为半导体市场带来了新的发展机遇。当前&#xff0c;我们使用的许多前沿数字化设备背后的技术都要依靠半导体才能实现。 由于无人驾驶、人工智能、5G和物联网等新兴技术的发展&#xff0c;以及对技术研发的持续投…

batch批处理程序easyadd——追加单行文本到指定txt文件末尾

介绍 有时候需要打开记事本在末尾追加文本&#xff0c;如果手动找到txt文件&#xff0c;再打开txt文件&#xff0c;按 ctrlhome 到达文末&#xff0c;才能完成对txt文件的追加&#xff0c;比较繁琐。而且如果txt文件很大&#xff08;比如词典文件&#xff09;&#xff0c;手动…

短信备份(原)

昨天在学习回调的时候&#xff0c;发现了其独特的魅力之处&#xff0c;它将业务代码逻辑和我们的工具类耦合性大大降低了。 应用场景&#xff1a;在实际开发中&#xff0c;经常会随着用户的需求的改变而对对话框的样式进行相应修改&#xff0c;在短信的备份过程中&#xff0c;往…