精华内容
下载资源
问答
  • 内存泄漏和野指针的区别
    2021-03-12 12:17:56

    内存泄漏

    概念解释

    使用动态存储分配函数或关键字申请的内存空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束。即所谓内存泄漏。

    表现行为

    程序运行时间越长,占用内存越多,最终用尽全部可用内存,整个系统崩溃。由程序申请的一块内存,已经使用完毕,未进行释放那么这块内存就泄露了。一是指针已置空,那么没有任何指针指向它;二是指针未置空,但也不再有效使用。

    导致原因:

    • new申请动态内存,使用完毕后未delete释放内存;
    • malloc申请动态内存,使用完毕后未free释放内存;

    野指针

    概念解释

    野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
    "野指针"不是NULL指针,是指向"垃圾"内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。

    表现行为

    程序崩溃或发生不可预知的错误。

    导致原因

    • 指针变量没
    更多相关内容
  • 内存泄漏和野指针

    2020-08-27 16:16:27
    内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自动释放池中,或者没有free 对象,导致这块内存一直被...如何形象的解释内存泄漏和野指针 内存泄漏:首先要说到如何为一块变量申请一块内存空间。

    内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自动释放池中,或者没有free 对象,导致这块内存一直被占用,换一种方法说,就是没有指针指向这块内存,再通俗点,开辟了一段空间,在没有被释放之前,结果找不到这块内存了,这样就会造成内存泄漏的问题。这块内存会直至程序运行结束才会被释放。

    野指针:是指针指向已经delete 的对象,或者是未申请访问的受限制的区域的时候,会造成野指针指向,直接使程序奔溃。
    在这里插入图片描述

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

    内存泄漏:首先要说到如何为一块变量申请一块内存空间。

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

    但是现在要注意的是每拿到一次新的首地址,旧的首地址就会被覆盖,但是旧的内存空间的使用权依然在程序手里。这里要分清楚两个概念,系统和程序。通常情况下,是由程序向系统申请空间,空间的分配权在系统手里。虽然旧的地址呗覆盖,但是使用权依旧掌握在程序手中,所以,程序能使用的空间越来越少,最终导致内存不够而泄露。

    野指针:当程序向系统申请一块内存空间时候,程序会把申请号好的这块内存空间的首地址赋给变量a,假设变量a拿到的首地址是0x3456,那么当这块空间使用完成被free释放了之后,这块空间的使用权又被程序还给了系统,但是这个时候如果没有给变量a赋NULL值,那么变量a手里拿到的依旧还是这个首地址0x3456,这个地址是没有被销毁的,所以既然它有一个首地址,那么就可以指向一个地址,但是,由于这个地址所在的内存空间的使用权已经不属于程序,因此,这个时候变量a的指向操作就是不合法的,这样的指针就被称为野指针。

    在这里我用一个比喻来说明什么是内存泄漏,什么是指针。
    张三指的是变量a;房产证指的是内存空间的使用权;钥匙指的是内存空间的首地址。
    在这里插入图片描述

    当张三拿到房子1的房产证和钥匙,这个时候他就可以使用这个房子1,过了一段时间,张三又买了一套房子,我们简称房子2,但是这个时候张三把房子1的钥匙给丢了,由于房产证依然是张三的,所以别人不能住这个房子,但是由于张三没有了钥匙,所以他也不能进到房子1里,房子1就这样被空置下来。
    以此类推,当张三买了很多套房子,但是由于他弄丢了钥匙住不了,而别人是因为没有房产证,所以也住不了,所以这些房子都空置下来了。当空置的房子过多时,就变成了内存泄漏。

    当张三拿到房子的钥匙和房产证,当房产证被free了(内存被释放),也就等于说房产证丢了。
    这个时候如果变量a没有赋NULL值,也就等于说钥匙还在张三手里(首地址还在变量a中),所以虽然钥匙还在张三手中,但是没有房产证,他再进这个房子就变成非法进入了,这就是野指针。
    如何形象的解释内存泄漏和野指针

    展开全文
  • 野指针和内存泄漏

    2020-08-05 21:40:40
    什么是野指针?   野指针并不是NULL指针,它是一个指向“垃圾”内存的指针,也就是说指向的地址是随机的,无法得知他的地址,操作系统自动对其进行初始化。   在计...

    什么是野指针?

      野指针并不是NULL指针,它是一个指向“垃圾”内存的指针,也就是说指向的地址是随机的,无法得知他的地址,操作系统自动对其进行初始化。
      在计算机中,内存的分配由操作系统来管理,要使用内存需要先向操作系统申请,系统分配后才可以使用,而野指针的内存空间是由系统随机分配的,属于非法访问内存。

    野指针有什么危害?

      当一个指针成为了野指针,他的指向就是随机的,当你使用了一个指向随机地址的指针时,他的危害程度也是随机的,不可预测的,它一般会造成内存泄漏,而且很容易遭受到黑客还有病毒的攻击,只要将病毒什么的放入这块内存中就可以,当你使用这个指针的时候就就开始执行病毒或其他程序

    什么叫作内存泄漏?

      内存泄漏是由于疏忽或错误造成程序没有及时释放已经不使用的内存情况。内存泄漏并不是物理意义上的内存消失,而是由于程序分配了一段内存后,并不能对这段内存进行控制,造成了内存的浪费。
      简单的说,内存泄漏分为两方面:

    1. 非法访问空间。
    2. 访问已经释放了的空间

    怎样产生野指针?

    1. 在创建指针时没有对指针进行初始化。
    2. 在释放了指针后没有将其指向NULL。
    3. 在指针变量的作用域之外使用指针

    如何避免野指针?

    1. 养成良好的编码习惯。
    2. 定义指针时,要进行初始化,如果没有确定的值,就让它指向NULL。因为NULL在宏定义是#define NULL (void **) 0 它代表的是零地址,零地址是不能进行任何读写操作的。
    3. 当要给指针指向的空间进行赋值时,要检查有没有给这个指针分配空间。方法如下:
    int *p = malloc(sizeof(int));
    //这里说明一下为什么赋值的是int整形类型的字节长度,而不是4,因为不同平台上的整形类型的字节长度不相同,
    //如果要跨平台使用会带来不必要的麻烦,这要就很好的提高了代码的移植性
    if(p == NULL)
    {
    	printf("分配失败\n");
    	exit(1);//跳出整个程序,return是跳出一个程序
    }
    
       
    • 8
    1. 要将申请好的空间进行初始化操作。因为这段空间可能会存在之前数据的残留,会对程序造成影响。可以用memset(p,0,sizeof(int))将指针指向的空间都置为0。
    2. 使用完指针要及时将指针释放,与malloc所对应的为free(p);
    3. 释放完成后要将指针指向NULL,否则会生成野指针
    展开全文
  • 如何形象的解释内存泄漏和野指针

    千次阅读 2016-05-09 21:34:25
    内存泄漏:首先要说到如何为一块变量申请一块内存空间。 当你要为变量a申请一块内存空间的时候,需要用到malloc函数。如何申请这块内存空间呢?这就变成程序的工作了。程序首先会向系统申请一块内存空间,然后程序会...

    内存泄漏:首先要说到如何为一块变量申请一块内存空间。

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

    但是现在要注意的是每拿到一次新的首地址,旧的首地址就会被覆盖,但是旧的内存空间的使用权依然在程序手里。这里要分清楚两个概念,系统和程序。通常情况下,是由程序向系统申请空间,空间的分配权在系统手里。虽然旧的地址呗覆盖,但是使用权依旧掌握在程序手中,所以,程序能使用的空间越来越少,最终导致内存不够而泄露。

    野指针:当程序向系统申请一块内存空间时候,程序会把申请号好的这块内存空间的首地址赋给变量a,假设变量a拿到的首地址是0x3456,那么当这块空间使用完成被free释放了之后,这块空间的使用权又被程序还给了系统,但是这个时候如果没有给变量a赋NULL值,那么变量a手里拿到的依旧还是这个首地址0x3456,这个地址是没有被销毁的,所以既然它有一个首地址,那么就可以指向一个地址,但是,由于这个地址所在的内存空间的使用权已经不属于程序,因此,这个时候变量a的指向操作就是不合法的,这样的指针就被称为野指针。


    在这里我用一个比喻来说明什么是内存泄漏,什么是指针。

    张三指的是变量a;房产证指的是内存空间的使用权;钥匙指的是内存空间的首地址。


    当张三拿到房子1的房产证和钥匙,这个时候他就可以使用这个房子1,




    过了一段时间,张三又买了一套房子,我们简称房子2,但是这个时候张三把房子1的钥匙给丢了,由于房产证依然是张三的,所以别人不能住这个房子,但是由于张三没有了钥匙,所以他也不能进到房子1里,房子1就这样被空置下来。



    以此类推,当张三买了很多套房子,但是由于他弄丢了钥匙住不了,而别人是因为没有房产证,所以也住不了,所以这些房子都空置下来了。当空置的房子过多时,就变成了内存泄漏。



    当张三拿到房子的钥匙和房产证,当房产证被free了(内存被释放),也就等于说房产证丢了。


    这个时候如果变量a没有赋NULL值,也就等于说钥匙还在张三手里(首地址还在变量a中),所以虽然钥匙还在张三手中,但是没有房产证,他再进这个房子就变成非法进入了,这就是野指针。


    展开全文
  • 文章目录野指针问题什么是野指针野指针问题成因内存泄漏智能指针 野指针问题 什么是野指针 在c++中,使用指针是需要解引用去访问一块内存地址的。当一个指针变量指向的地址是非法地址时,就会出现野指针问题。一般...
  • C 语言库函数malloc原型为 void malloc(size_t size),返回一个类型为void的指针,用于申请一块连续的指定大小的内存块区域以void类型返回申请的内存地址,如果申请空间失败,返回为NULL 、malloc函数在头文件stdlib...
  • 文章目录内存泄漏发生原因内存溢出发生原因野指针 内存泄漏 概念:内存泄漏是指我们在内存中申请(new/malloc)了一块内存,但是没有去动手释放(delete/free)内存,导致指针已经消失,而指针所指向的空间还被占用...
  • 今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正。 内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自动释放池中...
  • 内存泄漏指的是程序中有申请内存的过程,但在程序结束之后,始终没有或者无法释放占有的内存的则称为内存泄漏,单次的内存的泄漏可能用户并不会察觉,但是累积的内存泄漏将会十分可怕,无论内存的大小,终会被耗光。...
  • malloc函数free函数...如果分配成功则返回指向被分配内存指针(此存储区中的初始值不确定),否则返回空指针NULL。 此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域
  • 内存泄漏是指是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 我们在删除一个指针之后,编译器只会释放该指针所指向的内存空间...
  • 内存泄漏:1 访问已经释放的内存 2 访问没有权限的内存。
  • 内存泄漏  用动态存储分配函数(new或malloc)( 需要进行内存是否申请成功的判断)动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束。即所谓内存泄漏...
  • 本帖最后由 彭智林老师 于 2016-5...每一天都在用心,每天都在严格要求自己,而且人生嘛,只有拼出来的精彩,绝无等待出来的辉煌,所以我们首先呢我们应该向自己身边的每一个努力的小伙伴致敬对不对?。接下来呢,...
  • 内存泄漏 百度百科上的定义:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 一看定义,坑好像更多...
  • 尽管C++ 野指针和内存...今天主要说说在使用c++过程中,如何避免解决野指针和内存泄漏问题。 野指针野指针的出现会导致程序崩溃,这是每个人都不愿意看到的。Linux会生成coredump文件,可用gdb分析。Win下.
  • (1)内存主要分为5个存储区 栈(Stack):局部变量,函数参数等存储在该区,由编译器自动分配释放; 堆(Heap):需要程序员手动分配释放(new,delete),属于动态分配方式; 全局/静态存储区:全局变量,静态...
  • 1.Q:什么是内存泄漏? A:用动态存储分配函数动态开辟的控件,在使用完毕后没有释放,结果导致一直占据该内存单元,直到程序结束,称为内存泄漏。 2.Q:什么是野指针? A:指指向一个已删除的对象或未申请...
  • 内存泄漏  用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束。...由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露
  • 野指针和内存泄露

    2015-06-25 00:42:04
     1)野指针和内存泄露  a、野指针概念  到底什么是野指针?怎么去理解这个"野"呢? 生活中关于"野"的词:  ①野孩子:没人要、没人管的孩子---->行为动作不守规矩,调皮捣蛋的孩子。 ②野狗:没有主人的狗,没有...
  • 内存泄漏野指针

    2020-01-15 12:44:19
    内存泄漏野指针 1.内存泄漏 #include<iostream> using namespace std; //内存泄漏情况 void test1() { int *a = new int(); cout << a << "空间并没有被释放" << endl; } 在申请了...
  • 前篇最后,我们为消除内存泄漏野指针等问题所做的代码尝试还是存在问题,本篇我们来讨论一下剩下的问题以及后续改进。 为了方便大家阅读,我们先直接贴上上篇最后的代码。 #include <memory> #include <...
  • 提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心灵魂,它的地位咱们就不再熬述了,今天我们想跟大家讲的是指针中的两个特有名词:“悬空指针”野指针”。 悬空指针 C语言中的指针可以指向...
  • 内存泄漏是指我们在堆中申请(new/malloc)了一块内存,但是没有去手动的释放(delete/free)内存,导致指针已经消失,而指针指向的东西还在,已经不能控制这块内存, 所以就是内存泄漏了,看下面的例子。 void ...
  • 浅谈野指针和空指针的区别

    千次阅读 2021-01-17 11:04:06
    文章目录空指针野指针内存泄露 空指针 没有存储任何的内存地址的指针就称为空指针(NULL指针)。 空指针就是被赋值为0的指针,在没有初始化之前,它的值为0。 int *s1 = NULL; 野指针 野指针不是NULL指针,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,378
精华内容 6,151
热门标签
关键字:

内存泄漏和野指针的区别