C++中的析构函数和delete的关系
2018-01-24 20:52
232 查看
析构函数
1.构造函数是初始化对象的非static数据成员,在函数体中还可以另外做一些事情;析构函数则是释放对象使用的资源,并销毁对象的非static数据成员。析构函数,没有返回值,也不接受参数(导致不能被重载),所以对于一个给定的类,只会有一个唯一的构造函数。格式如下:
~A();2.构造函数与析构函数的执行过程区别
在构造函数中,先执行成员的初始化,且按照它们在类中出现的顺序进行初始化,然后执行函数体中的内容。在析构函数中,首先执行的是函数体,然后销毁成员。成员按初始化顺序的逆序进行销毁。所以你要认识到,析构函数体自身并不直接销毁成员,成员是在析构函数体之后隐含的析构阶段中被销毁的。在整个对象销毁过程中,析构函数体是作为成员销毁步骤之外的另一部分进行的。
在一个析构函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,也就是说,看不见析构的过程是如何进行的。销毁类类型的成员需要执行成员自己的析构函数。内置类型没有析构函数,因此,销毁内置类型成员什么也不需要做。所以销毁一个内置指针类型的成员需要我们手动delete。与普通指针不同,智能指针是类类型,所以具有析构函数,因此智能指针成员在析构阶段会自动销毁。
3.析构函数在什么情况下会被调用
总的原则就是:当一个对象被销毁时,就会自动调用其析构函数。具体情况如下
变量在离开其作用域时被销毁。
当一个对象被销毁时,其成员被销毁。
容器(包括标准库容器和数组)被销毁时,其元素被销毁。
动态分配的对象,当对指向它的指针应用delete运算符时被销毁。
对于临时对象,当创建它的完整表达式结束时被销毁。
delete干了什么
delete之后,下次再重新申请的时候可以申请这块内存地址,也就是将这块地址放到了空闲链表上。如果你没有将p赋为NULL,那么p指针还是指向这块内存空间。只不过这个位置的内存数据已经被毁尸灭迹,此时的这个指针指向的内存就是一个垃圾内存。但是,别人不知道你已经delete,还以为依旧是合法指针,此时指针已经是“野指针”。如果不进行delete的话,那么这块内存是不能在申请使用的,也就是所谓的内存泄露。
所以说,delete并不是在删除指针,而是在清理内存。
析构函数和delete的关系
delete用于释放new在堆中动态生成的对象空间。释放时会自动调用类的析构函数,在析构函数中用于释放类内部动态分配的得到的资源。当然,由于内置类型没有析构函数,所以delete内置类型指针时,什么也不需要做。
相关文章推荐
- C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765
- delete和析构函数间的关系及细节
- C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针
- C++析构函数、构造函数、虚函数关系
- (需要确认一点)C++ 析构函数和delete运算符
- C++ vector的delete与clear的区别 - 析构函数
- 【c++】析构函数中delete this指针
- C++ 析构函数以及 delete 和delete[]的整理
- C++中new和delete的背后( call edx 调用虚表内的第二个函数(析构函数))
- c++ 析构函数中的delete对象的顺序
- C++第二节(2):复合类、析构函数、new、delete
- C++之匿名对象与析构函数的关系
- C++ 析构函数与delete[]
- delete 和 析构函数的关系
- delete和析构函数的关系
- C++中的new与delete与虚析构函数的关系的实验研究
- C++ 构造函数与析构函数详解(二)---自由存储 new和delete
- 【日常】C++ 的那些“坑” —— delete 与 析构函数 与 virtual 的 9 个小例子
- C++构造函数与析构函数的调用关系讨论
- C++学习-构造函数、析构函数与虚函数的关系