应用场景

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

问题描述:

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()释放内存并不会将指针置零,可以通过手动置零以免产生野指针。

Debug Assertion Failed _CrtlsValidHeapPointer(block) realloc堆引发的错误相关推荐

  1. Debug Assertion Failed.Expression:_BLOCK_TYPE_IS_VALID(phead-nBlockUse)

    Debug Assertion Failed.Expression:_BLOCK_TYPE_IS_VALID(phead->nBlockUse) 关于上面这个错误,我在上一篇文章中的程序遇到过了 ...

  2. debug assertion failed!报错

    debug assertion failed!报错.如下图所示,这类报错的原因有很多,我的代码里面报错为 this->SetWindowText("SN串口下载工具");这句 ...

  3. Debug Assertion Failed!

    有些程序在Debug编译的版本下运行会出现Debug   Assertion   Failed! 的错误,在Release版本下没事. 用以下方法可以快速找到错误的地方. 1.按F5运行你的程序 2. ...

  4. 出现问题Debug Assertion Failed!

    出现问题"Debug Assertion Failed!"? 解决方法:创建了一个线程后,没有停止线程. 如 CVorxThread m_queryAgentInfoThread; ...

  5. 抛出错误Debug Assertion Failed!

    出现这种情况很可能是使用了野指针,比如某个指针指向一个局部变量,而在该变量作用域外使用该指针引用了该对象. Assertion 是断言,用于假定某个条件肯定会满足,在debug模式下,当该条件不满足时 ...

  6. debug assertion failed是什么意思?_MD5是是什么?为什么很多压缩文件上都有这个东西?...

    有时候我们在网上下载文件的时候,会碰到这样一种情况,网站不仅给出了文件的大小,还给出了一个MD5码,这个MD5码是什么东西. 首先笔者先告诉大家MD5是一种加密算法,而MD5码的作用则是校验文件是否发 ...

  7. debug assertion failed是什么意思?_如何使用 pdb 来性感 debug 你的 Python 代码?

    当你的代码写得多了,你总会出现这样或者那样的错误,有时候代码突然可以用,有时候代码又突然傻逼,有时候你只是离开一会,它就自动好了-就像女生的心思,总是让人捉摸不透,总是那么的魔幻. 今天,小帅b来跟你 ...

  8. MFCbug之遇到不适当的参数或是Debug Assertion Failed

    问题如图: 以及 为什么出现这样的问题: 那肯定是你传入的参数有问题的啦,检查调用地方的参数,并且存放工程的文件夹不要有中文和空格. 解决方法: 因为我的问题是没加DoDateExchange,加上它 ...

  9. 打开同一个文件两次,第二次会报错出现debug assertion failed 的问题解决

    今天用MFC界面写了一个程序用到了文件的打开,测试的时候发现,点击打开按钮后,第一次可以正确读取文件路径,第二次就会报如上错误. 理了一下思路发现,第一次打开按钮后,程序open了一个CFile,此时 ...

最新文章

  1. Microsoft Dynamics CRM4.0 Data Auditing and Restore (数据审核和恢复)
  2. 分享一道阿里Java并发面试题 (详细分析篇)
  3. 总线接口与计算机通信(五)CAN总线
  4. 关于解决vue.js中组件的template内容不能换行的问题
  5. Java中BigDecimal的8种舍入模式
  6. Qt工作笔记-第三种方法在QGraphics上写文本
  7. 数据结构和算法面试题系列—二叉树面试题汇总
  8. Tensorflow 搭建自己的神经网络(四)
  9. 《版式设计——日本平面设计师参考手册》—第1章置入其他格式的文件
  10. vsftpd的参数说明和虚拟用户配置
  11. 超像素池化弱监督语义分割
  12. 洛谷——P1957 口算练习题
  13. hihocoder题目选讲
  14. 反向跟单——羊群效应
  15. 配备透明触摸屏 看3D全息投影概念手机
  16. c#语言中if语句多条件,关于C# if语句中并列条件的执行
  17. 牛客题库—软件测试(一)
  18. GitHub实现邀请他人一起协作
  19. 软件測试系列之入门篇(一)
  20. vs2019无法连接到远程服务器,VS2019无法添加引用问题

热门文章

  1. 87说明书 ikbc_女性玩家的首选!——IKBC白无垢. 樱机械键盘赏评
  2. mysql去重取最大值,逻辑类似oracle的over(partition by)函数
  3. termux配置python安装kali_安卓安装kali linux之Termux
  4. pmp知识点详解-项目大牛整理_PMP核心知识点—第四章:项目整合管理(一)
  5. python 跳过_python-pytest学习(九)-跳过用例skip
  6. 技术如何转型产品经理
  7. 【LeetCode】3月25日打卡-Day10
  8. yum 多线程插件,apt多线程插件
  9. 继续深入更新shell脚本容易出错的地方
  10. [改善Java代码]若有必要,使用变长数组