C++中的析构函数和delete的关系

https://blog.csdn.net/wk_bjut_edu_cn/article/details/79149540

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wk_bjut_edu_cn/article/details/79149540

析构函数

1.构造函数是初始化对象的非static数据成员,在函数体中还可以另外做一些事情;析构函数则是释放对象使用的资源,并销毁对象的非static数据成员。

析构函数,没有返回值,也不接受参数(导致不能被重载),所以对于一个给定的类,只会有一个唯一的构造函数。格式如下:

~A();
 
 
2.构造函数与析构函数的执行过程区别

在构造函数中,先执行成员的初始化,且按照它们在类中出现的顺序进行初始化,然后执行函数体中的内容。在析构函数中,首先执行的是函数体,然后销毁成员。成员按初始化顺序的逆序进行销毁。所以你要认识到,析构函数体自身并不直接销毁成员,成员是在析构函数体之后隐含的析构阶段中被销毁的。在整个对象销毁过程中,析构函数体是作为成员销毁步骤之外的另一部分进行的。

在一个析构函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,也就是说,看不见析构的过程是如何进行的。销毁类类型的成员需要执行成员自己的析构函数。内置类型没有析构函数,因此,销毁内置类型成员什么也不需要做。所以销毁一个内置指针类型的成员需要我们手动delete。与普通指针不同,智能指针是类类型,所以具有析构函数,因此智能指针成员在析构阶段会自动销毁。

3.析构函数在什么情况下会被调用

总的原则就是:当一个对象被销毁时,就会自动调用其析构函数。具体情况如下

①变量在离开其作用域时被销毁。

②当一个对象被销毁时,其成员被销毁。

③容器(包括标准库容器和数组)被销毁时,其元素被销毁。

④动态分配的对象,当对指向它的指针应用delete运算符时被销毁。

⑤对于临时对象,当创建它的完整表达式结束时被销毁。

delete干了什么

delete之后,下次再重新申请的时候可以申请这块内存地址,也就是将这块地址放到了空闲链表上。如果你没有将p赋为NULL,那么p指针还是指向这块内存空间。只不过这个位置的内存数据已经被毁尸灭迹,此时的这个指针指向的内存就是一个垃圾内存。但是,别人不知道你已经delete,还以为依旧是合法指针,此时指针已经是“野指针”。

如果不进行delete的话,那么这块内存是不能在申请使用的,也就是所谓的内存泄露。

所以说,delete并不是在删除指针,而是在清理内存。

析构函数和delete的关系

delete用于释放new在堆中动态生成的对象空间。 释放时会自动调用类的析构函数,在析构函数中用于释放类内部动态分配的得到的资源。
当然,由于内置类型没有析构函数,所以delete内置类型指针时,什么也不需要做。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值