C++中的析構器(Destructor)(也稱為析構函數)

在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.pswp.cn/web/67676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67676.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VLN視覺語言導航基礎

0 概述 視覺語言導航模型旨在構建導航決策模型 π π π&#xff0c;在 t t t時刻&#xff0c;模型能夠根據指令 W W W、歷史軌跡 τ { V 1 , V 2 , . . . , V t ? 1 } \tau\{V_1,V_2,...,V_{t-1}\} τ{V1?,V2?,...,Vt?1?}和當前觀察 V t { P t , R t , N ( V t ) } V_…

AI協助探索AI新構型的自動化創新概念

訓練AI自生成輸出模塊化代碼&#xff0c;生成元代碼級別的AI功能單元代碼&#xff0c;然后再由AI組織為另一個AI&#xff0c;實現AI開發AI的能力&#xff1b;用AI協助探索迭代新構型AI將會出現&#xff0c;并成為一種新的技術路線潮流。 有限結點&#xff0c;無限的連接形式&a…

Flux的三步煉丹爐——fluxgym(三):矩陣測試

前面兩篇文章給大家介紹了如何準備素材和怎么煉丹&#xff0c;現在我們拿到訓練完成后的多個Lora怎么才能確定哪個才是我們需要的、效果最好的呢&#xff1f;答案就是使用xyz圖表測試&#xff0c;也稱為矩陣測試&#xff0c;通過控制控制變量的方法對Lora模型批量生圖&#xff…

利用Muduo庫實現簡單且健壯的Echo服務器

一、muduo網絡庫主要提供了兩個類&#xff1a; TcpServer&#xff1a;用于編寫服務器程序 TcpClient&#xff1a;用于編寫客戶端程序 二、三個重要的鏈接庫&#xff1a; libmuduo_net、libmuduo_base、libpthread 三、muduo庫底層就是epoll線程池&#xff0c;其好處是…

文件讀寫操作

寫入文本文件 #include <iostream> #include <fstream>//ofstream類需要包含的頭文件 using namespace std;void test01() {//1、包含頭文件 fstream//2、創建流對象ofstream fout;/*3、指定打開方式&#xff1a;1.ios::out、ios::trunc 清除文件內容后打開2.ios:…

C++編程語言:抽象機制:模板(Bjarne Stroustrup)

目錄 23.1 引言和概觀(Introduction and Overview) 23.2 一個簡單的字符串模板(A Simple String Template) 23.2.1 模板的定義(Defining a Template) 23.2.2 模板實例化(Template Instantiation) 23.3 類型檢查(Type Checking) 23.3.1 類型等價(Type Equivalence) …

定制Centos鏡像(二)

本章是對上篇文章的擴展&#xff1a; https://blog.csdn.net/qq_50247813/article/details/145286244 上篇文章學習了如何自定義鏡像安裝。這篇介紹如何在定制鏡像的時候安裝其他軟件&#xff1b; &#xff08;源文件參考上篇文章&#xff09; 根據上篇文章的步驟&#xff0c;…

【機器學習理論】樸素貝葉斯網絡

基礎知識&#xff1a; 先驗概率&#xff1a;對某個事件發生的概率的估計。可以是基于歷史數據的估計&#xff0c;可以由專家知識得出等等。一般是單獨事件概率。 后驗概率&#xff1a;指某件事已經發生&#xff0c;計算事情發生是由某個因素引起的概率。一般是一個條件概率。 …

Flutter 新春第一彈,Dart 宏功能推進暫停,后續專注定制數據處理支持

在去年春節&#xff0c;Flutter 官方發布了宏&#xff08;Macros&#xff09;編程的原型支持&#xff0c; 同年的 5 月份在 Google I/O 發布的 Dart 3.4 宣布了宏的實驗性支持&#xff0c;但是對于 Dart 內部來說&#xff0c;從啟動宏編程實驗開始已經過去了幾年&#xff0c;但…

計算機組成原理——存儲系統(一)

在人生的道路上&#xff0c;成功與失敗交織成一幅豐富多彩的畫卷。不論我們是面對勝利的喜悅&#xff0c;還是遭遇失敗的痛苦&#xff0c;都不能放棄對夢想的追求。正是在這種追求中&#xff0c;我們不斷地超越自我&#xff0c;不斷地突破自己的極限。只有勇往直前&#xff0c;…

前端知識速記:節流與防抖

前端知識速記&#xff1a;節流與防抖 什么是防抖&#xff1f; 防抖是一種控制事件觸發頻率的方法&#xff0c;通常用于處理用戶頻繁觸發事件的場景。防抖的核心思想是將多個連續觸發事件合并為一個事件&#xff0c;以減少執行次數。它在以下場景中特別有效&#xff1a; 輸入…

無人機圖傳模塊 wfb-ng openipc-fpv,4G

openipc 的定位是為各種模塊提供底層的驅動和linux最小系統&#xff0c;openipc 是采用buildroot系統編譯而成&#xff0c;因此二次開發能力有點麻煩。為啥openipc 會用于無人機圖傳呢&#xff1f;因為openipc可以將現有的網絡攝像頭ip-camera模塊直接利用起來&#xff0c;從而…

藍橋杯例題一

不管遇到多大的困難&#xff0c;我們都要堅持下去。每一次挫折都是我們成長的機會&#xff0c;每一次失敗都是我們前進的動力。路漫漫其修遠兮&#xff0c;吾將上下而求索。只有不斷努力奮斗&#xff0c;才能追逐到自己的夢想。不要害怕失敗&#xff0c;害怕的是不敢去嘗試。只…

【JavaEE進階】圖書管理系統 - 壹

目錄 &#x1f332;序言 &#x1f334;前端代碼的引入 &#x1f38b;約定前后端交互接口 &#x1f6a9;接口定義 &#x1f343;后端服務器代碼實現 &#x1f6a9;登錄接口 &#x1f6a9;圖書列表接口 &#x1f384;前端代碼實現 &#x1f6a9;登錄頁面 &#x1f6a9;…

【算法設計與分析】實驗8:分支限界—TSP問題

目錄 一、實驗目的 二、實驗環境 三、實驗內容 四、核心代碼 五、記錄與處理 六、思考與總結 七、完整報告和成果文件提取鏈接 一、實驗目的 掌握分支界限求解問題的思想&#xff1b;針對不同的問題&#xff0c;能夠利用分支界限法進行問題拆分和求解以及時間復雜度分析…

【3】阿里面試題整理

[1]. ES架構&#xff0c;如何進行路由以及選主 路由&#xff1a;在Elasticsearch&#xff08;ES&#xff09;中&#xff0c;默認的路由算法是基于文檔的_id。具體來說&#xff0c;Elasticsearch會對文檔的_id進行哈希計算&#xff0c;然后對分片數量取模&#xff0c;以確定該文…

【Linux】opencv在arm64上提示找不到libjasper-dev

解決opencv在arm64上提示找不到libjasper-dev的問題。 本文首發于?慕雪的寒舍 問題說明 最近我在嘗試編譯opencv&#xff0c;安裝依賴項libjasper1和libjasper-dev的時候就遇到了這個問題。在amd64平臺上&#xff0c;我們可以通過下面的命令安裝&#xff08;ubuntu18.04&…

【數據結構】_時間復雜度相關OJ(力扣版)

目錄 1. 示例1&#xff1a;消失的數字 思路1&#xff1a;等差求和 思路2&#xff1a;異或運算 思路3&#xff1a;排序&#xff0b;二分查找 2. 示例2&#xff1a;輪轉數組 思路1&#xff1a;逐次輪轉 思路2&#xff1a;三段逆置&#xff08;經典解法&#xff09; 思路3…

基于微信小程序的電子商城購物系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

【linux】Linux 常見目錄特性、權限和功能

目錄特性默認權限主要功能/用途/根目錄&#xff0c;所有目錄的起點755文件系統的頂層目錄&#xff0c;包含所有其他子目錄和文件/bin基礎二進制命令目錄&#xff08;系統啟動和修復必需的命令&#xff09;755存放所有用戶可用的基本命令&#xff08;如 ls, cp, bash 等&#xf…