• 【C++】指针什么时候必须delete,什么时候可以不delete


    前言

    学C语言的基本都知道,指针资源在不使用时,需要delete

    但是我们也经常在代码中看到,很多指针,或者是基本类型数据,用完没有delete

    这到底是为什么呢,是编码者的疏漏,还是有的原因

    这是一个很有趣的小问题,通过这个问题,可以看出大家对C语言指针和内存管理的理解是否透彻

    很多初中级工程师,只是根据自己的直觉去决定什么时候delete,实际不一定理解其背后的原理

    这里先给出答案,不是所有的指针和变量都需要delete

    什么时候需要delete

    回答这个问题之前,大家必须先弄清,栈和堆的区别

    delete释放的并不是指针本身,而是指针指向的内存区域

    指针到底需不需要delete,是由其指向的内存区域决定的

    栈中的变量,是由程序自动进行管理的,当变量作用域结束后,程序就会自动释放,因此其内存区域不需要手动delete

    堆则是一种容量大,但效率很低的内存区域,需要用户手动去进行管理(自动管理会影响程序性能),必须手动delete

    所以答案就是,指向栈内存的指针不需要delete,指向堆内存的指针需要delete

    为什么要区分栈和堆

    栈的作用,是为了维持程序高效运行,主要是用来保存程序运行,函数调用过程中产生的基本数据

    栈的特点就是空间小,因此管理效率很高

    堆则相反,专门用来存储体积庞大的数据,栈只记录其内存地址,需要时再访问

    堆和指针的设计,就是为了把栈中不必要的数据,单独放到一个垃圾堆中去,从而保证栈的高效

    一般像基本类型,局部变量等类型的数据,我们会直接通过定义语句创建,存到栈内存中(也可以new,但是没必要)

    像数组,大的内存区域,复杂对象,我们则会通过new或malloc的方式,存到堆内存中

    所以,栈和堆的设计,是为了保证程序调度能高效的进行,像函数调用这种,在程序中是无时不刻都在进行的,必须保证效率

    如果只有栈一种内存结构会怎么样

    假如没有堆这种内存区域,我们将所有数据都放到栈当中,不限制栈的大小

    现在假设我们执行了一个函数,进行了一次新的函数调用

    函数的调用过程,会产生形参,局部变量等数据,我们要给这些数据分配内存

    这时我们就要去栈中寻找大小足够的内存空间

    但由于所有数据全部放到了栈结构当中,栈的体积就会特别大,记录的数据也特别多

    此时要从这么大的内存数据,找到一块大小合适的内存区域,查找效率就特别低了

    所以,只使用一种内存结构的做法,显然是错的

    除了存放大型数据,堆的另一个作用,是可以数据共享,多个函数中的指针,可以访问同一份数据

    不用像实参-形参这样,进行内存拷贝,在函数作用域结束时,还要进行形参的内存释放

    delete到底干了什么

    我们new一个对象时,系统会记录这个对象在内存中的起始地址和占用空间

    delete的时候,相当于告诉系统,这块内存,可以给其它程序去使用了

    如果不delete,则这块内存永远是被占用的,每new一个对象,就占用一块内存

    随着程序运行时长的增加,系统的内存很快会被耗完,这就是所谓的内存泄漏现象

  • 相关阅读:
    MyBioSource 重组人白细胞介素-24解决方案
    JDBC 1
    UE4(unreal Engine)中使用蓝图类Actor创建开关门,并使用鼠标和键盘控制开关门
    manjaro系统无法安装
    吃完饭后,到底是躺着、坐着、站着还是运动?看完终于不纠结了
    【愚公系列】2022年11月 微信小程序-优购电商项目-个人中心页面
    Oracle数据库之日期查询
    CSS选择器(selector)
    采用 vue3 + vite + element-plus + tsx + decorators + tailwindcss 构建 admin 管理员后台页面
    第一个Java程序
  • 原文地址:https://blog.csdn.net/u013718730/article/details/127951102