精华内容
下载资源
问答
  • 今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正。 内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自动释放池中...

    今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正。

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

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

    暂时只查到了这么多,以后如果有新的理解再往上面添加。

    最后还是那句话,大牛一笑而过,互励互勉,欢迎批评指正。

    转载于:https://www.cnblogs.com/hcbz/p/5406408.html

    展开全文
  • C++ 引用 VS 指针 区别

    2017-02-09 12:27:28
    引用和指针的区别 1 引用访问一个变量是直接访问,而指针是间接访问。 2 引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间 3 引用一经初始化不能再引用其他变量,而指针可以 4 指针...

    引用相当于起别名,可以作为形参和返回值,在定义的时候必须初始化。


    引用和指针的区别

    1 引用访问一个变量是直接访问,而指针是间接访问。

    2 引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间

    3 引用一经初始化不能再引用其他变量,而指针可以

    4 指针比较危险,可能会有野指针造成内存泄漏等问题,所以最好使用引用。

    展开全文
  • 指针的理解

    2020-04-29 16:00:01
    指针的理解指针概念为什么用指针指针运算(步长问题)指针常量与常量指针指针与数组的区别指针与引用的区别指针数组和数组指针指针函数(本质:函数)函数...:指针)堆的区别二级指针(指向指针的指针)内存泄漏...


    原文链接:https://blog.csdn.net/qq_40945965/article/details/79535153

    //指针概念
    //为什么用指针
    //野指针、空指针、this指针、悬垂指针(迷途指针)、智能指针、成员指针
    //指针运算(步长问题)
    //指针常量与常量指针
    //指针与数组的区别
    //指针与引用的区别
    //指针数组和数组指针
    //指针函数和函数指针
    //二级指针(指向指针的指针)
    //内存的动态分配:堆和栈的区别、内存泄漏

    指针概念

    指针是一种数据类型,可以用来操作内存。
    32位的编译器指针类型是4个字节,64位的编译器指针类型则为8个字节。

    为什么用指针

    <1>处理堆中存放的大型数据
    <2>快速访问类的数据成员和成员函数
    <3>以别名的方式向函数传递参数

    野指针、空指针、this指针、悬垂指针(迷途指针)、智能指针、成员指针
    野指针:未初始化的指针
    this指针:类中的指针,非const成员拥有,static成员没有
    悬垂指针(迷途指针):指向曾经存在的对象,但该对象已经不再存在了
    指向曾经存在的对象,但该对象已经不再存在了,此类指针称为垂悬指针。(代码在最后)

    指针运算(步长问题)

    指针在运算的时候切记与步长相关,指针相减运算的到两块内存的地址差

    指针常量与常量指针

    <1>指针常量(指针的常量)char * const p;//指针不可以改变,指针所指向的值可以改变

    <2>常量指针(常量的指针)const char *p;//指针可以改变,指针所指向的值不可以改变

    指针与数组的区别

    区别1:指针只占4个字节,而数组将根据其长度占据一定的连续的空间。
    区别2:虽然在表达式中数组名解释为指向数组中第一个元素的指针,但是用sizeof(数组名)得到的是整个数组的大小而不是4。
    区别3:指针是可以修改的左值,而数组名是不可以修改的左值。即int a[10],b[10];但是a=b;非法。
    区别4:定义一个字符指针并初始化一个字符串和定义一个数组并初始化一个字符串是不一样的。即char a[]=”abcdefg”; 和char *a=” abcdefg”;不一样。前者是局部/全局(取决于定义的位置),后者存储于常量区,不能再修改。两者都以’\0’结束。
    区别5:数组和指针访问元素的过程不一样。由于数组的名字就是数组第一个元素的地址,而指针的名字是指针的地址,指针地址里的内容 是数组首元素的地址,所以再用指针访问时会多一次间接寻址。

    指针与引用的区别

    区别1:引用必须被初始化,指针不必。
    区别2:引用初始化以后不能被改变,指针可以改变所指的对象。
    区别3:不存在指向空值的引用,但是存在指向空值的指针。

    指针数组和数组指针

    区别:数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。
    指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

    <1>数组指针(也称行指针)
    定义 int (*p)[n];
    ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。
    也就是说执行p+1时,p要跨过n个整型数据的长度。

    如要将二维数组赋给一指针,应这样赋值:

    int a[3][4];
    int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
    p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
    p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
    1
    2
    3
    4
    <2>指针数组
    定义 int p[n];
    []优先级高,先与p结合成为一个数组,再由int
    说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。
    如要将二维数组赋给一指针数组:
    int *p[3];
    int a[3][4];
    p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
    for(i=0;i<3;i++)
    p[i]=a[i]
    这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值。

    指针函数(本质:函数)和函数指针(本质:指针)

    区别:指针函数,本质是一个函数。函数返回类型是某一类型的指针
    函数指针,是指向函数的指针变量,即本质是一个指针变量。

    堆和栈的区别

    <1>申请方式:栈由系统分配,堆由程序员分配。
    <2>系统响应:只要栈的空间足够,系统将为程序提供内存,否则将提示栈溢出;系统将从空闲链表中删除空闲堆结点
    <3>大小限制:栈向低地址扩展,内存连续;堆向高地址扩展,内存不连续。
    <4>申请效率:栈速度快,堆速度慢,而且容易产生碎片,但是用起来方便。
    <5>存储内容:栈中存放函数参数,局部变量等信息;堆中内容由程序员安排。
    <6>存取效率:栈的效率高,堆的效率低;

    二级指针(指向指针的指针)

    作为函数参数的作用:在函数外部定义一个指针p,在函数内给指针赋值,函数结束后对指针p生效,那么我们就需要二级指针。

    内存泄漏

    <情况1>指针没有delete,却重复new : int *p = new int; p = new int;//错误
    <情况2>在被调函数内部定义指针并new一个堆内存,却没有返回,函数调用后指针释放,内存泄漏

    //迷途指针

    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    int *p = NULL;
    
    void func()
    {
        int i = 10;
        p = &i;
    }
    
    int main()
    {
        func();
        Sleep(10000);
        printf("%d\n", *p);
        printf("%d\n", *p);//迷途指针
    
        return 0;
    }
    
    展开全文
  • 谈谈你对指针的理解

    千次阅读 2018-03-13 00:34:44
    //指针概念 //为什么用指针 //野指针、空指针、this指针、悬垂指针(迷途指针)、智能指针、成员指针 ...//内存的动态分配:堆的区别内存泄漏 指针概念: 指针是一种数据类型,可以用来操作内...

    //指针概念
    //为什么用指针
    //野指针、空指针、this指针、悬垂指针(迷途指针)、智能指针、成员指针
    //指针运算(步长问题)
    //指针常量与常量指针
    //指针与数组的区别
    //指针与引用的区别
    //指针数组和数组指针
    //指针函数和函数指针
    //二级指针(指向指针的指针)
    //内存的动态分配:堆和栈的区别、内存泄漏

    指针概念:

    指针是一种数据类型,可以用来操作内存。


    为什么用指针

    <1>处理堆中存放的大型数据
    <2>快速访问类的数据成员和成员函数
    <3>以别名的方式向函数传递参数

    野指针、空指针、this指针、悬垂指针(迷途指针)、智能指针、成员指针
    野指针:未初始化的指针
    this指针:类中的指针,非const成员拥有,static成员没有
    悬垂指针(迷途指针):指向曾经存在的对象,但该对象已经不再存在了
    指向曾经存在的对象,但该对象已经不再存在了,此类指针称为垂悬指针。(代码在最后)


    指针运算(步长问题)

    指针在运算的时候切记与步长相关,指针相减运算的到两块内存的地址差


    指针常量与常量指针

    <1>指针常量(指针的常量)char * const p;//指针不可以改变,指针所指向的值可以改变

    <2>常量指针(常量的指针)const char *p;//指针可以改变,指针所指向的值不可以改变


    指针与数组的区别

    区别1:指针只占4个字节,而数组将根据其长度占据一定的连续的空间。
    区别2:虽然在表达式中数组名解释为指向数组中第一个元素的指针,但是用sizeof(数组名)得到的是整个数组的大小而不是4。
    区别3:指针是可以修改的左值,而数组名是不可以修改的左值。即int a[10],b[10];但是a=b;非法。
    区别4:定义一个字符指针并初始化一个字符串和定义一个数组并初始化一个字符串是不一样的。即char a[]=”abcdefg”; 和char *a=” abcdefg”;不一样。前者是局部/全局(取决于定义的位置),后者存储于常量区,不能再修改。两者都以’\0’结束。
    区别5:数组和指针访问元素的过程不一样。由于数组的名字就是数组第一个元素的地址,而指针的名字是指针的地址,指针地址里的内容 是数组首元素的地址,所以再用指针访问时会多一次间接寻址。


    指针与引用的区别

    区别1:引用必须被初始化,指针不必。
    区别2:引用初始化以后不能被改变,指针可以改变所指的对象。
    区别3:不存在指向空值的引用,但是存在指向空值的指针。


    指针数组和数组指针

    区别:数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。
    指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

    <1>数组指针(也称行指针)
    定义 int (*p)[n];
    ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。
    也就是说执行p+1时,p要跨过n个整型数据的长度。

    如要将二维数组赋给一指针,应这样赋值:

    int a[3][4];
    int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
     p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
     p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

    <2>指针数组
    定义 int *p[n];
    []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
    如要将二维数组赋给一指针数组:
    int *p[3];
    int a[3][4];
    p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
    for(i=0;i<3;i++)
    p[i]=a[i]
    这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值。


    指针函数(本质:函数)和函数指针(本质:指针)

    区别:指针函数,本质是一个函数。函数返回类型是某一类型的指针
    函数指针,是指向函数的指针变量,即本质是一个指针变量。


    堆和栈的区别

    <1>申请方式:栈由系统分配,堆由程序员分配。
    <2>系统响应:只要栈的空间足够,系统将为程序提供内存,否则将提示栈溢出;系统将从空闲链表中删除空闲堆结点
    <3>大小限制:栈向低地址扩展,内存连续;堆向高地址扩展,内存不连续。
    <4>申请效率:栈速度快,堆速度慢,而且容易产生碎片,但是用起来方便。
    <5>存储内容:栈中存放函数参数,局部变量等信息;堆中内容由程序员安排。
    <6>存取效率:栈的效率高,堆的效率低;


    二级指针(指向指针的指针)

    作为函数参数的作用:在函数外部定义一个指针p,在函数内给指针赋值,函数结束后对指针p生效,那么我们就需要二级指针。


    内存泄漏

    <情况1>指针没有delete,却重复new : int *p = new int; p = new int;//错误
    <情况2>在被调函数内部定义指针并new一个堆内存,却没有返回,函数调用后指针释放,内存泄漏

    //迷途指针

    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    int *p = NULL;
    
    void func()
    {
        int i = 10;
        p = &i;
    }
    
    int main()
    {
        func();
        Sleep(10000);
        printf("%d\n", *p);
        printf("%d\n", *p);//迷途指针
    
        return 0;
    }
    展开全文
  • 指针和数组

    2016-12-11 19:08:40
    3、从安全性来说:数组容易造成越界,而指针会出现野指针造成的内存泄漏。相比之下数组更为安全一点。 4、从函数形参来说:越界传指针用指针的指针,传两位及以上数组用的是数组指针。 5、从处理对象来说:指针...
  • C++指针

    2020-08-23 21:21:42
    目录智能指针为什么要使用智能指针:智能指针有没有内存泄露的情况智能指针的内存泄漏如何解决函数指针野指针指针数组的区别c++中的引用指针 智能指针 C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, ...
  • 做过C++编程同学总是自己管理内存,一不留神就会造成野指针或者内存泄漏。Java自动内存管理机制,“不需要”自己管理内存,统一由JVM管理。这一节将简要介绍java内存区域内存分配(本篇为了准确,以《java...
  • TX内推实习面试

    2017-03-26 20:45:20
    题目一:有一个5L和6L的容器,还有无限量的水,请问怎样能量出3L的水? 用装满水的5L倒进6L里,此时6L里还能装1L水,将5L再装满,...题目二:内存泄漏和野指针的区别 当所指向的对象被释放或者收回,但是对该指针没有作任何
  • C语言中mallocfree C++ 中newdelete #include <stdlib.h> #include <string.h> #include <iostream>...//野指针 // //内存泄漏 // //内存踩踏 // //malloc/free 与n...
  • C++智能指针<一>

    2017-08-27 17:10:13
    智能指针普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期。尤其的完成指针的自动删除以及指针指向内存区域的清理。...
  • IOS-------内存优化

    2020-06-10 13:56:03
    weakassign都是弱引用声明类型,最大的区别是什么呢? 1)、weak声明的变量释放后自动清空,赋值为nil。 2)、assign声明的变量释放后不会自动赋值为nil,而且会造成野指针错误。 2、循环引用 3、block问题 ...
  • 5、“野指针”产生原因及解决办法如下:6、new、delete、malloc、free关系7、 C++中有了malloc / free , 为什么还需要 new / delete?8、 free、delete为什么不用记录长度? 内存管理、new、delete,内存池相关问题 ...
  • C/C++基础知识点面试题

    万次阅读 多人点赞 2018-07-26 00:19:44
    目录 一、虚函数的数据结构,如何工作? 二、const与define的区别? 三、指针与引用的区别? ...四、指针与数据的区别?...十一、内存泄漏野指针 十二、static 十三、unionstruct 十四、new与ma...
  • 面经-C语言基础(一)

    2020-09-28 10:48:20
    什么是内存溢出/内存泄漏 c++中内存五大区 内存分配方式有哪几种 智能指针 野指针 static关键字 C++11中四种类型转换 深入理解数据库索引采用B树B+树原因 顶层指针底层指针 const 与 #define ...
  • C++工程师面试学习笔记基础知识static关键字CC++的区别C++中的四种cast转换指针引用的区别野指针智能指针智能指针内存泄漏为什么析构函数必须是虚函数,但默认析构函数不是虚函数fork函数strcpystrlenmapset...
  • C++后端面试题目

    2020-07-08 00:02:48
    内存泄漏怎么避免怎么检测内存溢出3. 堆栈4. static5. const6. URL7. CC++区别8. mallocnew区别9. 指针引用区别10.C++中内存分区11. 野指针12. 类默认函数13. classstruct区别14. 构造函数中初始值列表...
  • 复习笔记-CPP基础

    2020-03-08 22:40:58
    野指针13. 智能指针是否存在内存泄漏17. 析构函数是否必须是虚函数?C++默认析构函数为什么可以不是虚函数?18. 函数指针20. C++中析构函数21. 静态多态、动态多态22. 重载覆盖25. 虚函数实现26. 举例:在m...
  • 内存泄漏开始讲,讲到指针未被正确释放,期间想到了侯捷老师讲过string,但是似乎没说清楚。还想到深拷贝浅拷贝,但是面试官没有问。 2 conststatic区别 const只读不能被改变。static静态,全局共享? 3 ...
  • 02_作业题强化和野指针 03_向null地址copy数据和不断改变指针指向强化 04_有关字面量 05_间接赋值从0级指针到1级指针 06_间接赋值从1级指针到2级指针_技术推演_传智扫地僧 07_间接赋值是指针存在最大意义 08_间接...
  • 1.8.1,break 与 continue 的区别..................................................................................... 28 1.8.2,循环语句的注意点............................................................
  • C语言深度揭秘

    2012-04-12 13:21:16
    4.1.1,指针的内存布局.........................................74 4.1.2,“*”与防盗门的钥匙................................... 75 4.1.3,int *p = NULL *p = NULL 有什么区别?............................

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

内存泄漏和野指针的区别