C++中的析构器(Destructor)(也称为析构函数)

embedded/2025/2/4 2:24:10/

在C++中,析构器(Destructor)也称为析构函数,它是一种特殊的成员函数,用于在对象销毁时进行资源清理工作。以下是关于C++析构器的详细介绍:

析构函数的特点

  1. 名称与类名相同,但前面有一个波浪号 ~:例如,如果类名为 MyClass,那么析构函数的名称就是 ~MyClass
  2. 没有返回类型:和构造函数一样,析构函数也不声明返回类型,甚至连 void 也不允许。
  3. 不接受任何参数:析构函数不能有参数,因此不能被重载。
  4. 自动调用:当对象的生命周期结束时,析构函数会被自动调用。

析构函数的作用

析构函数主要用于释放对象在其生命周期内所占用的资源,比如动态分配的内存、打开的文件、网络连接等。如果不进行资源清理,可能会导致内存泄漏或其他资源泄漏问题。

示例代码

1. 简单示例
#include <iostream>class MyClass {
public:MyClass() {std::cout << "Constructor called" << std::endl;}~MyClass() {std::cout << "Destructor called" << std::endl;}
};int main() {{MyClass obj; // 创建对象,调用构造函数} // 对象的作用域结束,调用析构函数return 0;
}

代码解释

  • MyClass 类中定义了构造函数和析构函数。当在 main 函数的内部代码块中创建 MyClass 对象 obj 时,构造函数会被自动调用。当代码块执行结束,对象 obj 的生命周期结束,析构函数会被自动调用。
2. 动态内存管理示例
#include <iostream>class ArrayWrapper {
private:int* arr;int size;
public:ArrayWrapper(int s) : size(s) {arr = new int[size]; // 动态分配内存std::cout << "Constructor: Allocated array of size " << size << std::endl;}~ArrayWrapper() {delete[] arr; // 释放动态分配的内存std::cout << "Destructor: Freed array of size " << size << std::endl;}
};int main() {{ArrayWrapper wrapper(5); // 创建对象,调用构造函数进行内存分配} // 对象的作用域结束,调用析构函数释放内存return 0;
}

代码解释

  • ArrayWrapper 类的构造函数使用 new 运算符动态分配了一个整数数组。析构函数使用 delete[] 运算符释放了这个数组所占用的内存。当 wrapper 对象的生命周期结束时,析构函数会被自动调用,从而避免了内存泄漏。

析构函数的调用时机

  1. 对象离开其作用域:当对象在一个代码块中定义,代码块执行结束时,对象的作用域结束,析构函数会被调用。
  2. 使用 delete 运算符删除动态分配的对象:如果使用 new 运算符动态创建对象,使用 delete 运算符删除对象时,析构函数会被调用。
#include <iostream>class MyClass {
public:~MyClass() {std::cout << "Destructor called" << std::endl;}
};int main() {MyClass* obj = new MyClass(); // 动态创建对象delete obj; // 删除对象,调用析构函数return 0;
}
  1. 对象是类的成员,类的对象被销毁:如果一个类包含另一个类的对象作为成员,当包含类的对象被销毁时,成员对象的析构函数也会被调用。
#include <iostream>class InnerClass {
public:~InnerClass() {std::cout << "InnerClass destructor called" << std::endl;}
};class OuterClass {
private:InnerClass inner;
public:~OuterClass() {std::cout << "OuterClass destructor called" << std::endl;}
};int main() {OuterClass outer; // 创建包含类的对象// 当 main 函数结束,outer 对象被销毁,先调用 InnerClass 的析构函数,再调用 OuterClass 的析构函数return 0;
}

注意事项

  • 如果类中没有显式定义析构函数,编译器会自动提供一个默认析构函数。默认析构函数不执行任何操作。
  • 如果类中涉及动态内存分配或其他资源管理,一定要显式定义析构函数,以确保资源被正确释放。
  • 析构函数通常应该是虚函数,特别是在基类中,这样可以确保在通过基类指针删除派生类对象时,派生类的析构函数也能被正确调用,避免资源泄漏。
#include <iostream>class Base {
public:virtual ~Base() {std::cout << "Base destructor called" << std::endl;}
};class Derived : public Base {
public:~Derived() {std::cout << "Derived destructor called" << std::endl;}
};int main() {Base* ptr = new Derived();delete ptr; // 由于基类析构函数是虚函数,会先调用 Derived 的析构函数,再调用 Base 的析构函数return 0;
}

http://www.ppmy.cn/embedded/159347.html

相关文章

第二篇:多模态技术突破——DeepSeek如何重构AI的感知与认知边界

——从跨模态对齐到因果推理的工程化实践 在AI技术从单一模态向多模态跃迁的关键阶段&#xff0c;DeepSeek通过自研的多模态融合框架&#xff0c;在视觉-语言-语音的联合理解与生成领域实现系统性突破。本文将从技术实现层面&#xff0c;解构其跨模态表征学习、动态融合机制与…

计算机网络部分知识点(王道考研笔记)

计算机网络体系结构&#xff08;概念、框架&#xff09;&#xff08;选择填空题&#xff09; 什么是计算机网络&#xff1f; 计算机网络的概念&#xff1a;计算机网络是一个将众多分散的、自治的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软…

【LLM】DeepSeek-R1-Distill-Qwen-7B部署和open webui

note DeepSeek-R1-Distill-Qwen-7B 的测试效果很惊艳&#xff0c;CoT 过程可圈可点&#xff0c;25 年应该值得探索更多端侧的硬件机会。 文章目录 note一、下载 Ollama二、下载 Docker三、下载模型四、部署 open webui 一、下载 Ollama 访问 Ollama 的官方网站 https://ollam…

DeepSeek本地部署详细指南

DeepSeek本地部署详细指南 随着人工智能技术的飞速发展&#xff0c;本地部署大模型的需求也日益增加。DeepSeek作为一款开源且性能强大的大语言模型&#xff0c;提供了灵活的本地部署方案&#xff0c;让用户能够在本地环境中高效运行模型&#xff0c;同时保护数据隐私。以下是…

SuccessFactors OData OAuth with SAP IAS-generated SAML assertion

导读 IAS:一句话说明白。SAP相关的系统可以通过IAS登录&#xff0c;只要IAS登录&#xff0c;其他系统免密登录。 作者&#xff1a;vivi&#xff0c;来源&#xff1a;osinnovation 上图有三个角色&#xff1a;brower&#xff0c;就是自己的浏览器&#xff0c;sp就是我们的目标…

八股文 (一)

文章目录 项目地址一、前端1.1 大文件上传,预览1.2 首页性能优化1.2 流量染色,灰度发布1.3 Websock心跳机制,大数据实时数据优化1.4 Gpu 加速 fps优化1.5 echarts包大小优化和组件封装1.6 前端监控系统1.7 超大虚拟列表卡顿1. 实现2. 相关问题(1) 什么是虚拟化列表,为什么要…

【python】python油田数据分析与可视化(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【python】python油田数据分析与可视化&#xff08…

系统思考—决策

“人类理性是有限的&#xff0c;我们在复杂的世界中做出决策时&#xff0c;往往采用简化的模型。”——贝尔经济学奖得主赫伯特西蒙 面对复杂问题&#xff0c;我们往往没有足够的信息、时间或精力去做出完美决策&#xff0c;于是&#xff0c;我们依赖经验法则、直觉判断&#…