• 析构器(Destructor)
  • 手动释放到自动销毁
  • 发生时机
  • 析构器的作用
  • 语法规则
  • 析构规则
  • 析构器小结
  • 注意

析构器(Destructor)

手动释放到自动销毁

我们通过传入参数的方式,动态的申请了堆内存的大小,既是堆内存,有申请必然会有释放的。 当然可以通过传统的方式来释放申请的空间,现在我们介绍一种特别用于释放资源的方式:析构函数,与类名同(前面需要带个~号),无参无返回。会在对象销毁时自动被调用,我们可以将堆内存释放,放到其内。

#include <iostream>
#include <string.h>
using namespace std;
class Stack
{public:
Stack(int size)
{top = 0; _size = size; space = new int[_size]{0};
}~Stack()
{ delete []space;
}bool isEmpty();
bool isFull();
void push(int data);
int pop();private:
int *space;
int top;
int _size; };bool Stack::isEmpty()
{
return top == 0;
}

发生时机

以"~"开头与类名相同,无参无返回的函数,在类对象销毁时(栈/堆对象),自动调用,完成对象的销毁。尤其是类中己申请的堆内存的释放。

#include <iostream>using namespace std;struct Data
{public:Data(int y = 0, int m = 0, int d = 0)  //构造器:year(y), month(m), day(d){}~Data()       //析构器{cout << "xxxxxxxxxxxxxxxxx" << endl;}
private:int year;int month;int day;
};
int main()
{{Data d;}cout << "yyyyyyyyyyyy" << endl;Data* pd = new Data;delete pd;
}

执行结果为:

上面打印结果我们先进行解释说明:
第一行是创建的对象d在{}被使用完成之后打印。
第二行是主函数进行打印。
第三行是通过pd创建对象在释放对象的时候打印。

析构器的作用

在对象被销毁前被自动调用,用来处理清理工作。清理工作主要清理申请的堆内存空间。
在对象销毁前:存在的一种是栈上的空间,一种是堆上的空间。

那么上面的示例,所有的空间都是在栈区申请,所以析构器存在的意义并不是很大。上面代码中的析构器可以不用写,系统会提供一个空体析构器进行栈上数据的清理。

我们接下来举例一个需要的销毁堆上的对象:

我们动态申请的空间,就需要内存释放;
栈对象在堆内存申请了1024个字节,在对象执行完成之后会释放1024个字节,

构造机制和析构机制就是系统给我们提供的自动调用的过程,里面的内容还是需要我们自行编写。

那么对于栈对象和堆对象都是一样的,在对象执行完成之后都需要调用析构器进行空间释放。

代码示例:

#include <iostream>
#include <string.h>
using namespace std;class Stack
{public:Stack(int size = 1024)//生成对象的时候调用       构造器:top(0), SpaceSize(size), space(new char[size] {0})  //初始化列表{}bool isFull();bool isEmpty();void push(char ch);char pop();~Stack()            //析构器{cout << "xxxxxxxxxxxxx"<<endl;delete[]space;}private:int top;char* space;int SpaceSize;
};bool Stack::isFull()
{return top == SpaceSize;  //修改判满条件
}bool Stack::isEmpty()
{return top == 0;
}void Stack::push(char ch)
{space[top++] = ch;
}
char Stack::pop()
{return space[--top];
}int main()
{{Stack s;   //栈对象}Stack* ps = new Stack(1000);  //堆对象delete ps;return 0;
}

运行结果为:

语法规则

class 类名
{~类名()析构体
}class A
{~A(){}
}

析构规则

析构器小结

析构器并不是所有的时候都需要自实现。在没有堆空间的对象中,可以使用系统默认提供的空体析构器。在对象有堆空间申请的情况中,必须要有自定义的析构器对于申请的堆内存空间进行释放,析构器会在对象销毁前自动调用。

栈上的内存空间会在对象销毁时自动回收。

析构器与类同名,无参无返回值,前面加上一个~

在对象被销毁前自动调用,被调用于处理清理申请的堆空间对象。

如果没有自实现,系统提供一个默认的空体析构器。

注意

一般来说,不要把析构器划分为函数,而是C++提供的一种机制。不能单纯的理解为函数,而是一种析构机制。

C++析构器详解【C++析构器】相关推荐

  1. python装饰器详解51-python装饰器使用实例详解

    这篇文章主要介绍了python装饰器使用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python装饰器的作用就是在不想改变原函数代码的情 ...

  2. python装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  3. python装饰器详解-python装饰器使用实例详解

    这篇文章主要介绍了python装饰器使用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python装饰器的作用就是在不想改变原函数代码的情 ...

  4. python类装饰器详解-Python 装饰器详解

    开放封闭原则: 开放对扩展 封闭修改源代码 改变了人家调用方式 装饰器结构 """ 默认结构为三层!!!每层返回下一层内存地址就可以进行执行函数, 传参:语法糖中的传参可 ...

  5. python类装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  6. python装饰器详解-Python装饰器基础详解

    装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一 ...

  7. python装饰器详解-python 装饰器详解

    目录 一.装饰器遵循的原则 装饰器,顾名思义就是起装饰的作用,既然是装饰,那么被装饰的对象是啥样就是啥样,不能有丝毫改变.在这里,我们写装饰器就是必须把握不能修改被修饰函数的源代码这条铁律.如何遵循这 ...

  8. python自带装饰器详解_Python装饰器详解

    引言 装饰器简单来说是我们向一个现有的已经存在的函数或对象添加新的功能,同时呢我们又不用改变他现有的结构. 为什么我们需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye( ...

  9. python3装饰器详解_Python装饰器详解

    按照 Python 的编程原则,当一个函数被定义后,如要修改或扩展其功能应尽量避免直接修改函数定义的代码段,否则该函数在其他地方被调用时将无法正常运行.因此,当需要修改或扩展已被定义的函数的功能而不希 ...

  10. python类装饰器详解-Python装饰器详解

    python的装饰器其实是一个语法糖,第一行是@跟着一个表达式:第二行必须以def或者class起始(亦即函数或者class的定义). python的装饰器,必须是可调用的对象,而且必须是可以以一个参 ...

最新文章

  1. lisp直线连接圆象限电_用小学数学知识解释,为什么井盖是圆的?
  2. 【机器学习入门到精通系列】插值与拟合
  3. kafka log4j配置
  4. Nacos源码NacosServiceRegistryAutoConfiguration
  5. 前端跨域请求get_前端实现跨域访问
  6. Hazelcast入门指南第2部分
  7. iOS - LocalCache 本地数据缓存
  8. Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8
  9. 编译linux tq2440,QT4.8.2在TQ2440开发板上的移植(一)--编译和安装
  10. 信息学奥赛一本通(1108:向量点积计算)
  11. 从零开始学Pytorch(三)之多层感知机的实现
  12. Flutter进阶—简单平台插件实例
  13. o00o0o php,PHP $O00OO0=urldecode eval 解密,记一次商业源码的去后门
  14. [Java] 蓝桥杯 BEGIN-3 入门训练 圆的面积
  15. 通过外挂插件向预训练语言模型中融入知识
  16. 京西古道,王平到圈门的穿越
  17. 快速原型制造_快速原型初学者指南
  18. php a标签加nofollow,Z-Blog给文章所有的站外a链接添加nofollow的方法
  19. 计算机mac网关,如何在Mac OS X中获取默认网关地址 | MOS86
  20. UVM入门与进阶学习笔记16——sequencer和sequence(2)

热门文章

  1. 【django】配置URLconf
  2. Linux shell/makefile/gic/python指令速查-inprocess
  3. [ARM异常]-ARMV8-aarch64 异常(中断)是如何跳转到向量表的
  4. leetcode刷题练习
  5. java查看虚拟机信息_java分析工具系列4:jinfo(实时的调整和查看虚拟机信息)...
  6. ida demangled names
  7. 【攻防世界019】SignIn
  8. vs2019 编译 WRK 踩坑记录
  9. 漏洞评估的优先级决定了网络安全保护的成本
  10. 【PHP】循环 调用第三方API (curl ),性能优化