内存泄漏和野指针

野指针、僵尸对象、内存泄漏 一、野指针: c语言的野指针:定义一个指针变量没有初始化,指针变量的值指向一块随机的空间,这个指针叫做野指针。 oc中的野指针:指针指向的对象已经被回收,这样的指针叫做野指针。 二、僵尸对象: 一个已经被释放的对象,但是这个对象所占空间还没有分配给别人使用,这样的对象叫做僵尸对象。 野指针去访问僵尸对象有可能出现问题。设置野指针为nil,当指针为nil时,通过这个指针去调用对象的方法,不会报错,没有任何反应。 打开检查僵尸对象机制(选中diagnostics诊断中的enable... 阅读详情

内存泄漏

也称作“存储渗漏”

  用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。

内存泄漏概念

  简单的说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。

泄漏的分类

  以发生的方式来分类,内存泄漏可以分为4类:

  (1). 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

  (2). 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

  (3). 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

  (4). 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

  从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。

内存泄漏的表现

  内存泄漏或者是说,资源耗尽后,系统会表现出什么现象哪?

  cpu资源耗尽:估计是机器没有反应了,键盘,鼠标,以及网络等等。这个在windows上经常看见,特别是中了毒。

  进程id耗尽:没法创建新的进程了,串口或者telnet都没法创建了。

  硬盘耗尽:机器要死了,交换内存没法用,日志也没法用了,死是很正常的。

  内存泄漏或者内存耗尽:新的连接无法创建,free的内存比较少。发生内存泄漏的程序很多,但是要想产生一定的后果,就需要这个进程是无限循环的,是个服务进程。当然,内核也是无限循环的,所以,如果内核发生了内存泄漏,情况就更加不妙。内存泄漏是一种很难定位和跟踪的错误,目前还没看到有什么好用的工具(当然,用户空间有一些工具,有静态分析的,也会动态分析的,但是找内核的内存泄漏,没有好的开源工具)

  内存泄漏和对象的引用计数有很大的关系,再加上c/c++都没有自动的垃圾回收机制,如果没有手动释放内存,问题就会出现。如果要避免这个问题,还是要从代码上入手,良好的编码习惯和规范,是避免错误的不二法门。

  一般我们常说的内存泄漏是指堆内存的泄漏。

  堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。

  应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

 

野指针

  “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:

  一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

  二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例:

[cpp]  view plain  copy
  1. char *p = (char *) malloc(100);  
  2. strcpy(p, “hello”);  
  3. printf(“%s ”,p);  
  4.   free(p); // p 所指的内存被释放,但是p所指的地址仍然不变  
  5.   if(p != NULL) // 没有起到防错作用  
  6. strcpy(p, “world”); // 出错  
  7. printf(“%s \n”,p);  

         以上代码的输出结果是helloworld。

free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点!

         通俗点说,free的作用就是把你合法居住的房子,取消你的居住资格,而没有拆房子,你还可以去那个房子住,但是警察(system)可以在任何时候把你赶走。

  另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。


手把手教你用支付宝密钥工具生成RSA2密钥对(含Windows/Mac操作截图) 本文详细介绍了如何使用支付宝密钥工具生成RSA2密钥对,包括Windows和Mac平台的操作步骤与截图。从工具下载、安装到密钥生成、配置支付宝平台,再到开发环境集成实战,手把手教你完成支付宝支付接口对接。特别强调密钥安全管理和最佳实践,帮助开发者避免常见安全隐患。 阅读详情

相关推荐

二、租用AutoDL服务器与连接教程

点击右上角控制台,选择【租用新的实例】;,我这里使用的是xshell和xftp工具(自行下载)。打开本地目录和服务器目录,直接拖动文件。

zzf021122的博客 1327

野指针和内存泄漏

野指针可能会造成内存泄漏,内存泄漏不一定就是野指针造成的(注,野指针不是一定会造成内存泄漏,如果它随机指向的是一个变量地址,则就不会造成内存泄漏了) 内存泄漏: 定义:程序中已动态分配的堆内存由于某种原因,程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果 造成内存泄漏的原因有两点:对象没有被释放、循环引用 野指针: 定义:如果内存已经释放,而指针还在引...

专心扫地 1638

Oracle数据库安装及配置(Oracle19c)

Windows 10安装Oracle 19c教程

weixin_69200200的博客 2万+

C++的内存泄漏与野指针

一、定义 野指针:访问一个已销毁或者访问受限的内存区域的指针,野指针不能判断是否为NULL来避免 悬垂指针:指针正常初始化,曾指向一个对象,该对象被销毁了,但是指针未置空,那么就成了悬空指针。结果未定义,往往导致程序错误,而且难以检测 二、野指针产生的原因 1.指针定义时未被初始化:指针在被定义的时候,如果程序不对其进行初始化的话,它会随机指向一个区域,因为任意指针变量(出了static修饰的指针)它的默认值都是随机的 2.指针被释放时没有置空:我们在用malloc()开辟空间的时候,要检查返回值

sinat_31608641的博客 1322

(一)利用Python实现数据集读取,Python基本文件操作介绍

机器学习是计算机对大量数据的分析过程,在机器学习的实际项目中,通常都需要准备数据集,数据集通常包含的数据数量是庞大的。例如,在处理计算机视觉领域的项目时,每一张图片都是一个单独的文件,为了提高模型训练的效果,图片数量通常会比较多,因此需要合理且高效的操作将所有的图片数据读取。本篇旨在介绍如何用Python对海量文件进行遍历,也是机器学习实践的第一步。.........

ZZR2631574030的博客 6356

Win11右键菜单显示更多选项设置默认展开方法

在Windows 11操作系统中,用户可能会发现右键点击桌面空白处时,弹出的菜单中仅显示“显示更多选项”,而并非直接展示所有可用的选项。这对于希望快速访问特定功能的用户来说,无疑增加了一些不便。为了优化这一体验,本文将介绍两种简单的方法,帮助用户设置Win11右键菜单,使其默认展开包含的所有选项。通过上述两种方法,用户可以轻松地将Win11右键菜单设置为默认展开所有选项,从而提高工作效率和便捷性。希望这篇文章对你有所帮助!

nntxthml的博客 1万+

什么是野指针和内存泄漏?如何避免野指针

内存泄漏:1 访问已经释放的内存 2 访问没有权限的内存。

dreamispossible的博客 1184

Zotero搭配CNKI.js插件:一键批量下载知网文献的完整教程(附常见问题解决)

本文提供Zotero搭配CNKI.js插件实现知网文献批量下载的完整教程。详细介绍了从环境准备、插件安装到实战操作的全流程,并针对常见问题提供解决方案,旨在帮助科研人员高效构建自动化文献管理工作流,显著提升文献收集与整理效率。

e4f5g6h7的博客 1202

野指针和内存泄露

内存泄漏 也称作“存储渗漏”   用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。 内存泄漏概念   简单的说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。 泄漏的分类

liaoye's blog 2997

深度学习-161-Dify工具之对比使用工作流和聊天流生成图表可视化的html文件

分别使用聊天流和工作流进行数据分析结果的可视化,生成html文件。聊天流可以配置带记忆,这样就可以多次交互优化结果。

qq_20466211的博客 1709

MFC实现图书管理系统(附完整源码)

MFC实现图书管理系统(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 801

c++野指针和内存泄漏

尽管C++ 野指针和内存泄漏一直被诟病,但是在实时性很强的应用场合,c++ 仍然是不二之选。游戏服务器开发仍然使用c++ 作为主语言,但是大多结合动态脚本技术,一方面规避了野指针和内存泄露,一方面获得了开发效率和扩展性的红利。但脚本技术不是本文的讨论重点,事实上关于c++ 与 lua的技术文章我也一直在整理中,将会另文别述。今天主要说说在使用c++过程中,如何避免和解决野指针和内存泄漏问题。 野

晴天的专栏 1315

FC7300 Clock介绍

FC7300的时钟架构包括一个高级时钟图和内部时钟需求。它有5个CMU,使用SIRC监控FIRC/SOSC/FOSC,并使用FIRC监控SIRC。此外,CMU4还使用FOSC监Slow Clock。

舊梦的博客 327

如何形象的解释内存泄漏和野指针

内存泄漏:首先要说到如何为一块变量申请一块内存空间。 当你要为变量a申请一块内存空间的时候,需要用到malloc函数。如何申请这块内存空间呢?这就变成程序的工作了。程序首先会向系统申请一块内存空间,然后程序会把申请好的这块内存空间的首地址赋给变量a,假设这时候变量a拿到的首地址为0x1234,如果我们现在要对变量a进行循环操作,那么每循环一次,变量a就会拿到一个新的首地址,这样的话,内存空间就会

sheep_and_stone的博客 3286

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

c++开发如何避免和解决野指针和内存泄漏问题

https://www.cr173.com/html/18707_1.html 尽管C++ 野指针和内存泄漏一直被诟病,但是在实时性很强的应用场合,c++ 仍然是不二之选。游戏服务器开发仍然使用c++ 作为主语言,但是大多结合动态脚本技术,一方面规避了野指针和内存泄露,一方面获得了开发效率和扩展性的红利。今天主要说说在使用c++过程中,如何避免和解决野指针和内存泄漏问题。 野指针: 野指针的出现会导致程序崩溃,这是每个人都不愿意看到的。Linux会生成coredump文件,可用gdb分析。Win下.

happylzs2008的专栏 1047

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++中的野指针和内存泄漏问题

文章目录野指针问题什么是野指针野指针问题成因内存泄漏智能指针 野指针问题 什么是野指针 在c++中,使用指针是需要解引用去访问一块内存地址的。当一个指针变量指向的地址是非法地址时,就会出现野指针问题。一般我们在写代码的时候,会对指针变量有一个判空处理,但是对于野指针时,是不会被 ‘ ptr == nullptr ’ 中识别出来的。会导致在接下来的代码逻辑中,造成非法访问,异常,导致进程崩溃退出等等的问题。 野指针问题成因 野指针问题也是一个在实际代码工作中很常见的一个问题,也会不同的情况导致野指针问题出现:

sy1227081317的博客 886

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

malloc函数,内存泄漏以及野指针

一、malloc函数 C 语言库函数malloc原型为 void malloc(size_t size),返回一个类型为void的指针,用于申请一块连续的指定大小的内存块区域以void类型返回申请的内存地址,如果申请空间失败,返回为NULL 、malloc函数在头文件stdlib.h里面, 一般将malloc函数和free函数一起使用,因为在Windows下面系统不会自动回收malloc开辟的空间,要free函数进行释放空间,在Linux下malloc在程序结束后,系统会回收这个空间。 示例代码 #

学习记录,交流学习 1084

什么是内存泄漏以及什么是野指针

玩QT的时候基本不用操心这两个问题,最近才开始会碰到这两个问题,顺手百了一把 内存泄漏 也称作“存储渗漏”   用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。   内存泄漏概念   简单的说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程...

kissinger_1984的专栏 252

内存泄漏与野指针

内存泄漏与野指针 1.内存泄漏 #include<iostream> using namespace std; //内存泄漏情况 void test1() { int *a = new int(); cout << a << "空间并没有被释放" << endl; } 在申请了堆空间之后并之后并没有用delete释放空间造成内存泄漏,即 ...

Worthy_Wang的博客 259

什么是内存泄漏?什么是野指针?什么是内存越界?如何避免?

内存泄漏 百度百科上的定义:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 一看定义,坑好像更多了,动态分配,堆内存是什么? 某种原因包含哪种原因? 未释放我能理解,无法释放是什么时候 看后果很严重,运行速度减慢!系统崩溃!那么内存究竟为什么这么强?? 危害举了一个例子,比如服务...

weixin_41066529的博客 3826

C语言的野指针和内存泄漏

1、野指针定义      野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。2、如何避免野指针 解决野指针的方案 (1)定义指针时 把指针变量赋值成null (2)释放内存时,先判断指针变量是否为null (3) 释放内存完毕后,把

初中生的博客 712

C/C++内存泄漏和野指针的区别

内存泄漏 概念解释 使用动态存储分配函数或关键字申请的内存空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束。即所谓内存泄漏。 表现行为 程序运行时间越长,占用内存越多,最终用尽全部可用内存,整个系统崩溃。由程序申请的一块内存,已经使用完毕,未进行释放那么这块内存就泄露了。一是指针已置空,那么没有任何指针指向它;二是指针未置空,但也不再有效使用。 导致原因: new申请动态内存,使用完毕后未delete释放内存; malloc申请动态内存,使用完毕后未fre

心向阳光,斗志昂扬! 833
上一篇: 动态顺序表的基本操作(C语言版)
下一篇: 关于 奇偶数 排列的方法(C语言)
Code_zx
博客等级 码龄9年 83粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值