C++ 中的 delete[] 机制剖析

本文简单总结了delete[]放在析构函数中VS放在主函数中的区别(针对自己定义类)。

  • delete原理简单剖析(摘自https://zhidao.baidu.com/question/154090209.html,个人认为解释到位):

    我们编译出来的程序运行时是和操作系统打交道的,程序中用到的内存都向操作系统申请,在多任务的操作系统下,不允许普通的程序访问未分配的内存。操作系统手里有一张表,标明内存中的哪些单元被哪个程序占用了,哪些是空闲的(空闲不一定是空值,我们编写的程序如果动态变量没有初始化往往会带有不定值,就是这个缘故),当程序提出申请,它就把空闲的内存分配给程序。程序运行完后操作系统再把分配给的内存标记为空闲,以供其他程序用。我个人的猜测,执行delete只是将它后面变量的地址告诉给操作系统,操作系统把它手里的那张表给改了,但delete掉的指针没有变化,还是原来指向的变量的地址值(可以做个小实验,new出来的delete后指针不会变,但所指向的内存所存放的变量可能就变了;但如果定义另外一个指针,再将另外那个指针赋给当前指针,则delete后,所指向的内存所存放的变量仍然是不变的,因为只是指针的赋值,本质上还是两个指针)。

测试程序:

#include <iostream>

int main()
{
    int *p;
    int pp=9;
//    p=&pp;         //delete p后,指针所指向的内存还是pp的,pp并没有释放,还是9
    p=new int(5);    //delete p后,就是p所指向的内存被标记为空闲了,数据不确定
    cout<<p<<" "<<(unsigned int)p<<" "<< *p <<endl;//1
    delete p;
    cout<<p<<" "<<(unsigned int)p<<" "<< *p <<endl;//2

    return 0;
}
  • delete[] 放在主函数中时,是用来释放对象,执行这条语句会跳到析构函数中(这就是所谓的"在撤销对象占有的内存之前完成一些清理工作”,析构函数是提供一个在对象删除前可以释放这个对象所占有的资源的机会)。如果有多个对象则用delete[] ,单个对象的话直接delete。
  • 跳到析构函数中后,如果析构函数中有delete[] 语句,则释放这个对象(即this指针指向的当前对象)所拥有的指针成员变量所占用的空间(请注意:成员变量是指针类型时才需要delete,普通的不用(其实也不能,会报错的啦)),同理,有多个指针成员变量则用delete[] ,只有一个的话则delete即可。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

程序员如何迈过年薪30万的坎?

作为一个写了十几年代码的老程序员,程序员要想拿到年薪30万,起码需要具备以下几个条件:

18820
来自专栏程序员互动联盟

工程师、程序员、码农有什么区别?

正常来讲工程师范围更加广泛,包括程序员,现在有硬件工程师,实施工程师,安装工程师等等都属于工程师的范畴,一般称呼程序员高大上的称呼软件工程师。

81010
来自专栏Coding迪斯尼

快速在组合中查找重复和遗失的元素

12240
来自专栏程序员互动联盟

为什么程序员不去《非你莫属》求职?

就目前程序员的现状,稍微水平还不错的程序员只需要在各个招聘网站上投一下,就有很多面试的机会,没必要去非你莫属上面娱乐化找工作,之前也听过程序员上过的,估计是别的...

72630
来自专栏程序员互动联盟

程序员是否应该拿年薪百万的工资?

就目前国内程序员的薪资状态能达到百万级别的少的可怜,做技术开发做过几年之后很快就能达到天花板,就现在国内程序员水平年薪达到这一半就已经算是很不错的了,大部分的程...

12310
来自专栏程序员互动联盟

阿里巴巴待遇这么好,为什么还有这么多人离职?

不是每个阿里巴巴的职位待遇都是那么好,而且作为阿里巴巴几万人的大公司即使很低的比例离职也有相当的数量,这也属于正常的现象,正常来讲一个人离职主要有两种理由:

21830
来自专栏Phoenix的Android之旅

面试中的黑话

有几年工作经验的在跳槽时偶尔会听到面试官这么说 但HR怎么可能不在呢,面试也是提前约好的, 除非面试还要分几天面 不然意思就是说 "你很优秀,我们也想要, 但是...

38840
来自专栏Phoenix的Android之旅

被压榨的程序员--曾经以为买不起房还能租,现在连房也租不起了

作为最悲催的80后90后,毕业的时候刚好赶上房价大涨。工作几年,刚学会理财,又被15年的A股收割了一波。想换便宜点的房子住,却发现连城中村也要2000多一个月。...

26950
来自专栏程序员互动联盟

为什么程序员越来越排斥面试时做题?

从业十几年经历的不是很多, 算起来也就是三四家,在编程行业跳槽比较频繁的行业,这算是一股清流了,呆的习惯了也就懒得动了,主要还是觉得在一个公司呆的时间长点,才真...

29220
来自专栏C语言及其他语言

会泡妞的程序员都是怎么撩妹子的?

26940

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励