类的析构函数自动调用

news/2024/11/30 18:42:35/文章来源:https://www.cnblogs.com/chentiao/p/18578747

类的析构函数会自动调用。析构函数是在对象的生命周期结束时由系统自动调用的特殊成员函数,主要用于释放对象占用的资源,执行清理工作。

具体情况

  1. 自动调用的时机

    • 局部对象:当对象离开其作用域时,析构函数会自动调用。

      #include <iostream>
      class MyClass {
      public:~MyClass() {std::cout << "Destructor called!" << std::endl;}
      };int main() {MyClass obj;  // 构造函数调用// 离开作用域,obj 被销毁,调用析构函数return 0;
      }
      

      输出:

      Destructor called!
      
    • 动态分配的对象:当使用 delete 或 delete[] 释放动态分配的对象时,析构函数会被调用。

      MyClass* obj = new MyClass;
      delete obj;  // 调用析构函数
      
    • 容器管理的对象:当容器销毁时,析构函数会被调用以清理容器中存储的对象。

      std::vector<MyClass> vec(3);  // 构造三个对象
      // 离开作用域时,析构函数会依次调用
      
  2. 不会自动调用的情况

    • 如果对象是通过动态分配创建的(使用 new),但没有显式使用 delete,析构函数不会自动调用,造成内存泄漏
    • 使用 malloc 和 free 分配和释放内存时,不会调用构造函数或析构函数。
  3. 虚析构函数的注意事项

    • 如果基类的析构函数没有声明为 virtual,通过基类指针或引用删除派生类对象时,可能不会调用派生类的析构函数,导致资源未正确释放。

      class Base {
      public:~Base() { std::cout << "Base Destructor\n"; }
      };class Derived : public Base {
      public:~Derived() { std::cout << "Derived Destructor\n"; }
      };int main() {Base* obj = new Derived();delete obj;  // 只调用 Base 的析构函数return 0;
      }
      

      输出:

      Base Destructor
      

      修正:

      class Base {
      public:virtual ~Base() { std::cout << "Base Destructor\n"; }
      };class Derived : public Base {
      public:~Derived() { std::cout << "Derived Destructor\n"; }
      };int main() {Base* obj = new Derived();delete obj;  // 同时调用 Derived 和 Base 的析构函数return 0;
      }
      

      输出:

      Derived Destructor
      Base Destructor
      

总结

析构函数的调用是由编译器或运行时自动管理的,在对象生命周期结束时自动触发,用户通常无需手动调用。不过要注意在动态分配和继承场景下正确管理对象和声明虚析构函数,避免资源泄漏或不完全释放的问题。


当你使用 malloc 和 free 进行内存分配和释放时,确实不会调用构造函数或析构函数。这是因为 malloc 和 free 仅仅是对内存的分配和释放操作,它们不涉及对象的生命周期管理,因此不会触发构造和析构的调用。具体原因和情况如下:

1. malloc 和 free 的工作原理

  • malloc 是 C 语言中的内存分配函数,它从堆中分配指定大小的内存块,并返回指向该内存的指针。它只是简单地为指定大小的内存块分配空间,并不会对内存中的数据进行任何初始化。它只负责内存的分配,不会调用构造函数。

  • free 是 C 语言中的内存释放函数,它将通过 malloc 分配的内存块标记为可重用的,并将该内存归还给系统。free 只是释放内存,不会调用析构函数。

2. 构造函数和析构函数的调用

在 C++ 中,构造函数和析构函数是用于初始化和销毁对象的特殊成员函数。它们通常由 new 和 delete 运算符负责调用,而不是 malloc 和 free

  • new 和 delete 会在分配和释放内存时自动调用对象的构造和析构函数:

    • 当你使用 new 来分配内存时,C++ 会先分配足够的内存空间,然后在这块内存上调用类的构造函数来初始化对象。
    • 当你使用 delete 释放内存时,C++ 会先调用类的析构函数来清理对象资源,然后再释放内存。
  • malloc 和 free 不涉及对象的生命周期管理,它们只负责原始内存的分配和释放,不会调用构造函数和析构函数。

3. 代码示例

使用 malloc 和 free (没有调用构造函数/析构函数)

#include <iostream>
#include <cstdlib>  // malloc, freeclass MyClass {
public:MyClass() {std::cout << "Constructor called" << std::endl;}~MyClass() {std::cout << "Destructor called" << std::endl;}
};int main() {// 使用 malloc 分配内存MyClass* ptr = (MyClass*)malloc(sizeof(MyClass));// 注意:此时并未调用构造函数free(ptr);  // 释放内存// 注意:此时并未调用析构函数
}

输出:

(没有任何输出)

在上面的代码中,malloc 只分配了内存,并没有调用 MyClass 的构造函数,free 也没有调用析构函数。

使用 new 和 delete (会调用构造函数/析构函数)

#include <iostream>class MyClass {
public:MyClass() {std::cout << "Constructor called" << std::endl;}~MyClass() {std::cout << "Destructor called" << std::endl;}
};int main() {// 使用 new 分配内存并调用构造函数MyClass* ptr = new MyClass;// 使用 delete 释放内存并调用析构函数delete ptr;
}

输出:

Constructor called
Destructor called

在这个例子中,new 分配了内存并自动调用了构造函数,而 delete 释放内存时,自动调用了析构函数。

4. 为什么 malloc 和 free 不调用构造和析构函数?

malloc 和 free 是 C 标准库函数,它们是为 C 语言设计的,不关心 C++ 类的构造和析构过程。C++ 引入了 对象 的概念,要求在内存分配时不仅要分配内存空间,还要初始化对象的状态,因此引入了 new 和 delete 运算符,这两个运算符自动处理构造和析构。

5. 结论

  • 使用 malloc 和 free 分配和释放内存时,不会调用构造函数和析构函数,它们只是分配和释放原始内存空间。
  • 如果你需要在 C++ 中管理对象的生命周期,应该使用 new 和 delete,因为它们会自动调用构造和析构函数。
  • malloc 和 free 更适合用于 C 编程中,或者用于低级内存操作时,不涉及对象的生命周期管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/844215.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024NOIP

T1 编辑字符串 题意 给定两个字符串,某些位置固定不动,其余相邻位置可以互换,求最大匹配长度 方案 考虑将俩串分为多段,使得每段互相匹配长度最长 将相邻可换的部分划为一段,不可交换位置的单独一段。 由下图可知,若 A 串某位置字符与 B 串两个位置字符都可以匹配,则它与…

第十周学习总结

学期2024-2025-1 学号20241414 《计算机基础与程序设计》第十周学习总结 作业信息这个作业属于哪个课程 <班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里 <作业要求的链接>2024-2025-1计算机基础与程序设计第一周作业这个作业的目标 信息系统 数据…

20222410 2024-2025-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 1.1 本周学习内容回顾 1.2 实验要求 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 (2)Web前端javascipt 理解JavaScript的基本功能,理解DOM。 在(1)的基础上,编写JavaScript验证用户名、密码的规则…

黑马点评

黑马点评项目笔记代码仓库:https://gitcode.com/xu1feng/hm-dianpnig/overview 整体功能架构图短信登录 导入黑马点评项目 首先,导入数据库SQL文件hmdp.sql。 其中的表有:tb_user:用户表 tb_user_info:用户详情表 tb_shop:商户信息表 tb_shop_type:商户类型表 tb_blog:…

vxe-table 可编辑表格使用下拉树

vxe-table 可编辑表格使用下拉树<template><div><vxe-grid v-bind="gridOptions"></vxe-grid></div> </template><script> export default {data () {const regionEditRender = {name: VxeTreeSelect,options: [{label: 广…

Python蒙特卡罗MCMC:优化Metropolis-Hastings采样策略与Fisher矩阵计算参数推断应用—模拟与真实数据分析

全文链接:https://tecdat.cn/?p=38397 原文出处:拓端数据部落公众号 本文介绍了其在过去几年中的最新开发成果,特别阐述了两种有助于提升 Metropolis - Hastings 采样性能的新要素:跳跃因子的自适应算法以及逆 Fisher 矩阵的计算,该逆 Fisher 矩阵可用作提议密度。通过多…

数字技术助力电力行业低碳化发展路径及典型场景研究报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p=36371 在全球应对气候变化的大背景下,中国积极推进 “双碳” 战略,一场深刻的能源与经济变革正在展开。本报告合集汇总聚焦于能源领域多方面的关键议题,深入剖析其现状与发展趋势。能源作为中国碳排放的主导因素,火电占比过高致使排放问题…

关于Quartus的start按钮灰色无法下载的问题的解决

Quartus的start按钮灰色 可能一 首先记得连接实验板并且添加.sof文件 点击Hardware Setup选择USB-Blaster即可可能二 如果上面的找不到USB-Blaster,可进入电脑的设备管理器,找到其他设备中的USB-Blaster选项右击更新驱动,注意选择相应路径更新完成后再次回到Quartus应该就可…

easyexcel导出头部样式设置,多个tab导出,头部自定义RGB颜色

easyexcel导出头部样式设置,多个tab导出,头部自定义RGB颜色alibaba easyexcel版本 3.0.5, poi版本 4.1.2 ,导出头部样式设置,多个tab导出,头部自定义RGB颜色效果,头部三行,三个tab 下面贴出代码:package com.alpha.erp.dto.accounts;import com.alibaba.excel.metad…

管理模块源码

原文地址:https://bbs.huaweicloud.com/blogs/441056 本文翻译自:https://go.dev/doc/modules/managing-source当你在开发一个用于发布给其他人使用的模块时,可以通过遵循该主题中描述的仓库约定来确保您的模块更易于其他开发人员使用。 该模块描述了在管理模块仓库时可能采…

报错/core/library/think/File.php 第 153 行左右 mkdir():Permission denied

报错/core/library/think/File.php 第 153 行左右 mkdir():Permission denied这个提示是权限不足, 建议检查网站目录权限如果修改权限无效, 建议修改php版本测试。 扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3…

PbootCMS提示传递的模型编码参数有误,请核对后重试!

PbootCMS提示传递的模型编码参数有误,请核对后重试!解决办法: 程序这2个核心文件夹备份,apps 和 core 改名 apps1 和 core1 做为备份,下载默认程序把程序包里的apps 和 core上传上去即可。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通…