38.1 针对问题,解决问题

内存泄漏问题在小程序中很难被发现,只有在内存用完后,导致分配内存出现“bad alloc”时才能被发现。

如下是在“画六个圆环”时出现的“bad alloc”问题。(圆环的每个像素点都需要解一个一元四次方程,可能是在调用解方程函数时动态分配了太多的内存,然后忘了释放,然后内存全被用完了)

原因肯定是:动态分配的内存没有释放,导致内存泄漏。(new 和delete没有配合好。)

我们以调用“一元二次方程”函数为例,进行说明。

float* roots_quadratic_equation(float a, float b, float c) {

//the first element is thenumber of the real roots, and other elements are the real roots.

float *roots = new float[3];

/*为了使函数返回一个数组,将roots指针指向动态分配的数组空间的首地址,然后return roots将数组空间的首地址返回*/

if (a == 0.0) {

if (b == 0.0) {

roots[0] = 0.0;

}

else {

roots[1] = -c/b;

roots[0] = 1.0;

}

}

else {

float d = b*b - 4*a*c;

if (d < 0.0) {

roots[0] = 0.0;

}

else {

roots[1] = (-b +sqrt(d)) / (2*a);

roots[2] = (-b -sqrt(d)) / (2*a);

roots[0] = 2.0;

}

}

return roots;

}

int main(){

float *r= new float[3];

/*将r指针指向动态分配的数组空间的首地址*/

r =roots_quadratic_equation(1.0, -3.0, 2.0);

/*将roots_quadratic_equation()函数返回的指向动态分配的数组空间的首地址赋值给指针r,也就是使r指向在roots_quadratic_equation()动态分配的数组空间的首地址*/

for (int i=0;i<(r[0]+1); i++) {

std::cout <<"r[" << i << "]=" << r[i] << endl;

}

}

如上main()函数对roots_quadratic_equation()的调用存在两个问题:

其一,将r指向在roots_quadratic_equation()动态分配的数组空间的首地址后,在使用完后,需要delete [] r:

int main(){

float *r= new float[3];

r =roots_quadratic_equation(1.0, -3.0, 2.0);

for (int i=0;i<(r[0]+1); i++) {

std::cout <<"r[" << i << "]=" << r[i] << endl;

}

delete[] r;

}

因为r指向在roots_quadratic_equation()动态分配的数组空间的首地址,所以delete [] r释放的是:roots_quadratic_equation()动态分配的数组空间

这个确实可以有效地“减轻”问题。

作此修改后,运行结果:

报错时间晚了,但是还是“bad_alloc”

问题在哪?

其二,在main()函数中,声明指针时,没有必要指向一个动态分配的数组空间的首地址。否则,由于r在后面被重新赋值,所以main()函数中多余的动态分配的数组空间成了“僵尸空间”(无法寻址,无法释放)

int main(){

float *r;

r =roots_quadratic_equation(1.0, -3.0, 2.0);

for (int i=0;i<(r[0]+1); i++) {

std::cout <<"r[" << i << "]=" << r[i] << endl;

}

delete [] r;

}

修改完后的运行结果:

综述,对于调用“返回函数内部动态分配的空间地址”的函数:

float *r;

r =roots_quadratic_equation(1.0, -3.0, 2.0);

for (int i=0;i<(r[0]+1); i++) {

std::cout <<"r[" << i << "]=" << r[i] << endl;

}

delete[] r;

问题三十八:C++中bad alloc问题(1)——分析问题相关推荐

  1. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  2. Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...

    Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程) 原文:Android项目实战(三十八):2017最新 将AndroidLibrary ...

  3. JavaScript学习(三十八)—面向过程与面向对象

    JavaScript学习(三十八)-面向过程与面向对象 一.程序设计语言中的两大编程思想:面向对象.面向过程 (一).面向过程 就是指完成某个需求的时候,先分析出完成该需求时所需要经历的步骤有哪些,然 ...

  4. Android版疯狂填字第三关,iOS/安卓版《疯狂填字》答案攻略第三十八关

    <疯狂填字>,最创新的填字玩法,挑战你的脑细胞,现在就下载.疯狂填字是最早的在线中文填字游戏,现在你可以在苹果手机上玩填字也可以在安卓手机上面玩,既打发了时间,又增长了知识,你准备好挑战了 ...

  5. 第五章第三十八题(十进制转换八进制)(Decimal to octal)

    第五章第三十八题(十进制转换八进制)(Decimal to octal) **5.38(十进制转换为八进制)编写程序,提示用户输入一个十进制整数,然后显示对应的八进制值.在这个程序中不要使用Java的 ...

  6. 三十八、Fluent融化凝固模型参数设置依据

    1. 融化凝固模型概述 1.1 模型原理 我们在Chapter37分享了Fluent融化凝固模型案例,前文只是介绍了Fluent中的操作过程. 不知道大家会不会觉得很奇怪,Fluent模拟融化和凝固, ...

  7. CCNA实验三十八 ZFW(区域防火墙)

    CCNA实验三十八 ZFW(区域防火墙) 环境:Windows XP .Packet Tracert5.3 目的:了解ZFW的原理与基本配置 说明: ZFW(Zone-Based Policy Fir ...

  8. 左耳听风 第三十八周

    左耳听风 第三十八周 每周完成一个ARTS: 每周至少做一个 leetcode 的算法题.阅读并点评至少一篇英文技术文章.学习至少一个技术技巧.分享一篇有观点和思考的技术文章.(也就是 Algorit ...

  9. 视频教程-三十八课时零基础matlab精通优化算法-Matlab

    三十八课时零基础matlab精通优化算法 图像和算法等领域有多年研究和项目经验:指导发表科技核心期刊经验丰富:多次指导数学建模爱好者参赛. 宋星星 ¥100.00 立即订阅 扫码下载「CSDN程序员学 ...

  10. [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

最新文章

  1. 那个计算机应用没有广告,为什么别人的电脑没有什么广告,而你的电脑一大堆呢?答案在这里...
  2. Stimulsoft Reports.Silverlight 2013.2下载
  3. 使用pdb调试python
  4. Retrofit 2.0
  5. 基于Nginx的https服务
  6. 面试必问之JVM原理
  7. 前端学习(2629):npm安装成功配置
  8. 节目表演的点子_矿泉水桶当架子鼓,幼儿园小朋友出色表演,圈粉无数
  9. TurnipBit开发板DIY呼吸的吃豆人教程实例
  10. GitHub Actions 持续集成
  11. oracle decode函数
  12. FFMPEG模拟直播源
  13. HTML基础跟着李南江学编程
  14. 理财十问:1.你知道自己的风险偏好吗?
  15. lambda函数 python菜鸟教程-python
  16. GlobalSign 域名型 SSL 证书
  17. 使用node连接MongoDB的工具安装及配置
  18. 企立方-拼多多采集注意的点有哪些
  19. html 背景图片不重复显示,css如何设置背景图片不重复?
  20. 银河麒麟、中标麒麟 root权限登录

热门文章

  1. IBM参与马鞍山模式创新 为中国医疗信息化立新示范
  2. 【Pandas】CSV文件读取时手动指定头部
  3. PPT绘图保存为PDF的三种方式
  4. 用存储过程生成实体类
  5. Spring Data JPA 梳理 - JPA是什么
  6. 【算法导论】第5章,概率分析和随机算法
  7. Docker快速配置指南
  8. Java 中的volitle 关键字
  9. 股市像脱缰的“野牛”,谁是最好的“牛崽”?
  10. 经典排序 —— 选择排序