避免内存泄漏

让编程改变世界

Change the world by program


避免内存泄漏

这个话题就像古时候女人的裹脚布,又长又臭哈~ 前面我们讲过,分配了一个内存块但忘记了释放它,这是一种严重的错误。这样的内存块将等到程序执行结束时才会被释放掉。 如果程序会运行很长时间(例如在服务器上,注意不是所有的操作系统都想windows一样每天都要重启哈)并且在不停地申请新内存块,忘记释放那些已经不再有用的老内存块将迟早会把内存消耗殆尽,直接导致后边的new操作无法执行甚至是崩溃!   这样的编程漏洞我们称之为内存泄漏(memory leak),因为它会像水池里的漏洞那样把内存池里的可用内存慢慢地消耗殆尽。 new语句所返回的地址是访问这个内存块的唯一线索,同时也是delete语句用来把这个内存块归还给内存池的唯一线索。

我们一起来看下面这个栗子:

[codesyntax lang="c"]

new *x;x = new int[1000];
delete[] x;
x = NULL;

[/codesyntax]   这意味着如果这个地址值(保存在x里)丢失了,就会发生内存泄漏问题。 地址值会因为很多原因而丢失哦,比如因为一个指针变量被无意中改写,例如: [codesyntax lang="c"]

int *x;x = new int[3000];
x = new int[4000];delete[] x;
x = NULL;

[/codesyntax]   大家看出来了吗?这是会导致内存泄漏的情况之一。 会导致内存泄漏的另一种情况是用来保存内存块地址的指针变量作用域问题,例如: [codesyntax lang="c"]

void foo()
{My Class *x;x = new MyClass();
}

[/codesyntax]   当foo()函数结束时,指针变量x将超出它的作用域,这意味着它将不复存在,它的值当然就会丢失。

有两种方法可以用来堵住这样的漏洞:

第一个方法是在return语句之前的某个地方插入一条delete x语句: [codesyntax lang="c"]

void foo()
{MyClass *x;x = new MyClass();delete x;x = NULL;return;
}

[/codesyntax]   第二个方法是让函数把内存块的地址返回给它的调用者: [codesyntax lang="c"]

MyClass *foo()
{MyClass *x;x = new MyClass();return x;
}

[/codesyntax]

内存作用域

变量都有一个作用域:规定了它们可以在程序的哪些部分使用。 这个作用域通常就是对它们做出声明和定义的函数的函数体,如main函数或某个子函数。   如果被定义在任何一个函数的外部,变量将拥有全局作用域,这意味着它们可以在整个程序中的所有函数里使用。 不过,应该尽量避免使用全局变量,因为它们往往会让代码变得难以调试和容易出错!   动态内存不存在作用域的问题,一旦被分配,内存块就可以在程序的任何地方使用。 因为动态内存没有作用域,所以必须由程序员来跟踪它们的使用情况,并在不再需要用到它们的时候把它们及时归还给系统。 这里需要特别注意的是,虽然动态分配的内存块没有作用域,但用来保存其地址的指针变量是受作用域影响的。

与鱼油分享

专注那些我们应该去做的事情,并坚持下去! 一片飘落的树叶最终落在哪里,决定他的是上帝。至于我们,正如那片树叶一般,去努力想着我们的目标飞行就足够了。。。。。。 至于上帝的眷顾嘛?大家要知道,机会总是留给有准备的人。只有你朝着梦想去努力追求,才有可能实现梦想,而在困难与挫折面前停滞不前,忧虑苦闷肯定不属于追求梦想的范畴! [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://urlxf.qq.com/?RJbm2aa']视频下载[/Downlink] [Downlink href='http://kuai.xunlei.com/d/LUVEOOLZGBVF']备胎下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2012/08/05/3846221.html

避免内存泄漏 - C++快速入门38相关推荐

  1. 介绍 Java 的内存泄漏

    java最明显的一个优势就是它的内存管理机制.你只需简单创建对象,java的垃圾回收机制负责分配和释放内存.然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏.脚本代码 本教程演示了什 ...

  2. Java内存泄漏的介绍

    Java内存泄漏的介绍 Java最重要的优势之一是它的内存管理.您只需创建对象,Java Garbage Collector负责分配和释放内存.但是,情况并不那么简单,因为Java应用程序中经常发生内 ...

  3. 一次完整的JVM堆外内存泄漏故障排查记录

    前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...

  4. golang快速入门[8.3]-深入理解IEEE754浮点数

    前文 golang快速入门[1]-go语言导论 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速 ...

  5. 解决出现线程未关闭 , 造成内存泄漏问题

    解决出现线程未关闭 , 造成内存泄漏问题 16-Feb-2022 16:38:24.978 警告 [main] org.apache.catalina.loader.WebappClassLoader ...

  6. POI3.5 HSSFXSSF Excel 操作快速入门

    POI3.5 HSSF&XSSF Excel  操作快速入门 1 本文翻译自 http://poi.apache.org/spreadsheet/quick-guide.html 欢迎交流指正 ...

  7. android dbflow引起内存泄漏,DBFlow使用说明(1)快速入门

    在这一章节中,我们快速浏览一下如何创建一个简单的数据库.表和建立Model 之间的关系. 蚂蚁王国 :我们打算存储关于蚁群的数据.我们想要追踪和标记某个蚁群的所有蚂蚁和蚁后. 蚁群的关系是这样的: 蚁 ...

  8. windows7内存诊断工具有用吗_性能诊断利器 JProfiler 快速入门和实践

    云栖君导读:性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益.Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关 ...

  9. UWP开发入门(十六)——常见的内存泄漏的原因

    原文:UWP开发入门(十六)--常见的内存泄漏的原因 本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)--用Diagno ...

最新文章

  1. 【opencv】17.提取RBG各种颜色c++代码
  2. UVA1601The Morning after Halloween 单向加双向bfs
  3. android java 指针,opencv android:向我的代码中添加cascade分类器后出现空指针异常
  4. C# WinForm程序退出的方法
  5. 大数据---(3)金融数据架构
  6. IntObjectHashMap和HashMap的区别?
  7. matlab导入arcgis中国边界图,【干货】ArcGIS提取影像边界的几种方法
  8. 《和平精英》:新军需山经魅狐、滑板小狐今日正式上线,很帅气!
  9. python 经纬度画北京地图_python basemap 画出经纬度并标定的实例
  10. C语言编译.bat为 .exe
  11. [BZOJ2906] 分块
  12. 心中有佛,看谁都是佛;心中有屎,看谁都是屎。
  13. Arquillian测试框架快速上手教程(四)- 使用Arquillian + Drone + Selenium + Graphene 进行Web自动化测试
  14. MBR20200CT-ASEMI肖特基二极管MBR20200CT
  15. ABclonal再添一员“蛋白~DNA互作研究”大将—CUTTag
  16. allegro16.6使用汇总
  17. 华为云yum镜像源超慢改用阿里云镜像遇坑解决方法
  18. dede数据库的四张核心表
  19. UVA1600 巡逻机器人 Patrol Robot
  20. 浙江法院公开网文书PDF爬取

热门文章

  1. 华为又对计算机视觉下手了!
  2. 深入浅出 | 谈谈MNN GPU性能优化策略
  3. 精度优秀,速度214.7 fps !卡内基梅隆大学开源强大的3D多目标跟踪系统
  4. MaskFusion:惊艳的结合实例感知、语义分割、动态追踪的SLAM系统
  5. Python基础知识:当字典碰到类时会发生什么?
  6. 中科院自动化所研究员课题组PPT《如何撰写毕业论文?》
  7. 论文 | 多传感器数据深度图的融合:最近基于深度学习的方法(下)
  8. 学术 | 基于深度学习的图像边缘和轮廓提取方法介绍
  9. 【资源下载】旷视研究院张祥雨valse2019报告PPT——高效轻量级深度模型的研究与实践
  10. 计算机视觉中 RNN 应用于目标检测