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

您所在的位置:网站首页 爱上网友一定要删除吗 【C++】指针什么时候必须delete,什么时候可以不delete

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

2024-07-13 18:47| 来源: 网络整理| 查看: 265

前言

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

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

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

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

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

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

什么时候需要delete

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

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

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

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

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

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

为什么要区分栈和堆

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

delete到底干了什么

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

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3