最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++中虛析構(gòu)函數(shù)的作用及其原理分析

 更新時間:2019年04月08日 10:38:53   作者:Stoneplay26  
這篇文章主要介紹了C++中虛析構(gòu)函數(shù)的作用及其原理分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

C++中的虛析構(gòu)函數(shù)到底什么時候有用的,什么作用呢。

一.虛析構(gòu)函數(shù)的作用

總的來說虛析構(gòu)函數(shù)是為了避免內(nèi)存泄露,而且是當子類中會有指針成員變量時才會使用得到的。也就說虛析構(gòu)函數(shù)使得在刪除指向子類對象的基類指針時可以調(diào)用子類的析構(gòu)函數(shù)達到釋放子類中堆內(nèi)存的目的,而防止內(nèi)存泄露的.

我們知道,用C++開發(fā)的時候,用來做基類的類的析構(gòu)函數(shù)一般都是虛函數(shù)??墒牵瑸槭裁匆@樣做呢?下面用一個小例子來說明:

#include<iostream>
using namespace std;

class ClxBase
{
  public:
    ClxBase() {};
    virtual ~ClxBase() { cout<<"delete ClxBase"<<endl; };

    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };

};

class ClxDerived : public ClxBase
{
  public:
    ClxDerived() {};
    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };

    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };

};

int main(int argc, char const* argv[])
{
   ClxBase *pTest = new ClxDerived;
   pTest->DoSomething();
   delete pTest;
  return 0;
}

但是,如果把類ClxBase析構(gòu)函數(shù)前的virtual去掉,那輸出結(jié)果就是下面的樣子了:

沒有調(diào)動子類的析構(gòu)函數(shù)

也就是說,類ClxDerived的析構(gòu)函數(shù)根本沒有被調(diào)用!一般情況下類的析構(gòu)函數(shù)里面都是釋放內(nèi)存資源,而析構(gòu)函數(shù)不被調(diào)用的話就會造成內(nèi)存泄漏。我想所有的C++程序員都知道這樣的危險性。當然,如果在析構(gòu)函數(shù)中做了其他工作的話,那你的所有努力也都是白費力氣。

所以,文章開頭的那個問題的答案就是--這樣做是為了當用一個基類的指針刪除一個派生類的對象時,派生類的析構(gòu)函數(shù)會被調(diào)用。

當然,并不是要把所有類的析構(gòu)函數(shù)都寫成虛函數(shù)。因為當類里面有虛函數(shù)的時候,編譯器會給類添加一個虛函數(shù)表,里面來存放虛函數(shù)指針,這樣就會增加類的存儲空間。所以,只有當一個類被用來作為基類的時候,才把析構(gòu)函數(shù)寫成虛函數(shù)。

總結(jié)一下虛析構(gòu)函數(shù)的作用:

(1)如果父類的析構(gòu)函數(shù)不加virtual關鍵字
當父類的析構(gòu)函數(shù)不聲明成虛析構(gòu)函數(shù)的時候,當子類繼承父類,父類的指針指向子類時,delete掉父類的指針,只調(diào)動父類的析構(gòu)函數(shù),而不調(diào)動子類的析構(gòu)函數(shù)。

(2)如果父類的析構(gòu)函數(shù)加virtual關鍵字
當父類的析構(gòu)函數(shù)聲明成虛析構(gòu)函數(shù)的時候,當子類繼承父類,父類的指針指向子類時,delete掉父類的指針,先調(diào)動子類的析構(gòu)函數(shù),再調(diào)動父類的析構(gòu)函數(shù)。

二.虛析構(gòu)函數(shù)的原理分析

#include<iostream>
using namespace std;

class Base
{
public:
  Base(){cout<<"create Base"<<endl;}
  virtual ~Base(){cout<<"delete Base"<<endl;}
};

class Der : public Base
{
public:
  Der(){cout<<"create Der"<<endl;}
  ~Der(){cout<<"Delete Der"<<endl;}
};
int main(int argc, char const* argv[])
{
  Base *b = new Der;
  delete b;

  return 0;
}

從創(chuàng)建講起,用gdb調(diào)試你會發(fā)現(xiàn),

(1)先調(diào)用父類的構(gòu)造函數(shù),再調(diào)用子類的構(gòu)造函數(shù),

這里有一個問題:父類的構(gòu)造函數(shù)/析構(gòu)函數(shù)與子類的構(gòu)造函數(shù)/析構(gòu)函數(shù)會形成多態(tài),但是當父類的構(gòu)造函數(shù)/析構(gòu)函數(shù)即使被聲明virtual,子類的構(gòu)造/析構(gòu)方法仍無法覆蓋父類的構(gòu)造方法和析構(gòu)方法。這是由于父類的構(gòu)造函數(shù)和析構(gòu)函數(shù)是子類無法繼承的,也就是說每一個類都有自己獨有的構(gòu)造函數(shù)和析構(gòu)函數(shù)。

(2)而由于父類的析構(gòu)函數(shù)為虛函數(shù),所以子類會在所有屬性的前面形成虛表,而虛表內(nèi)部存儲的就是父類的虛函數(shù)

即使子類也有虛函數(shù),但是由于是單繼承,所以也只有一張?zhí)摫?,這在上一篇博客多態(tài)中講到過。
執(zhí)行 Base *b = new Der;之后b的最終形態(tài)

(3)當delete父類的指針時,由于子類的析構(gòu)函數(shù)與父類的析構(gòu)函數(shù)構(gòu)成多態(tài),所以得先調(diào)動子類的析構(gòu)函數(shù);之所以再調(diào)動父類的析構(gòu)函數(shù),是因為delete的機制所引起的,delete 父類指針所指的空間,要調(diào)用父類的析構(gòu)函數(shù)。
所以結(jié)果就是這樣

以上所述是小編給大家介紹的C++中虛析構(gòu)函數(shù)的作用及其原理分析詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • QT中對話框的使用示例詳解

    QT中對話框的使用示例詳解

    這篇文章主要為大家詳細介紹了Qt中對話框的使用,以及QMessageBox類中常見函數(shù)的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下
    2022-11-11
  • C語言輸出唯一的子串

    C語言輸出唯一的子串

    這篇文章主要介紹了C語言輸出唯一的子串,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-12-12
  • C++關鍵字之likely和unlikely詳解

    C++關鍵字之likely和unlikely詳解

    這篇文章主要介紹了C++關鍵字之likely和unlikely,C++20之前的,likely和unlikely只不過是一對自定義的宏,而C++20中正式將likely和unlikely確定為屬性關鍵字,本文給大家詳細講解,需要的朋友可以參考下
    2022-10-10
  • C++?STL標準庫std::vector擴容時進行深復制原因詳解

    C++?STL標準庫std::vector擴容時進行深復制原因詳解

    我們知道,std::vector之所以可以動態(tài)擴容,同時還可以保持順序存儲,主要取決于其擴容復制的機制。當容量滿時,會重新劃分一片更大的內(nèi)存區(qū)域,然后將所有的元素拷貝過去
    2022-08-08
  • 通俗易懂講解C語言與Java中二叉樹的三種非遞歸遍歷方式

    通俗易懂講解C語言與Java中二叉樹的三種非遞歸遍歷方式

    二叉樹是一種非常重要的數(shù)據(jù)結(jié)構(gòu),很多的數(shù)據(jù)結(jié)構(gòu)都是基于二叉樹的基礎演變過來的。二叉樹的前,中,后3種遍歷方式,因為樹的定義本身就是遞歸定義的,所以采用遞歸的方法來實現(xiàn)是很簡單的
    2021-09-09
  • 簡單解讀C++中的虛函數(shù)

    簡單解讀C++中的虛函數(shù)

    這篇文章主要介紹了C++中的虛函數(shù),在C++中,虛函數(shù)聯(lián)系到多態(tài)、多態(tài)聯(lián)系到繼承,因而虛函數(shù)是C++中的一大重要特性,需要的朋友可以參考下
    2016-04-04
  • 詳細分析C++ 信號處理

    詳細分析C++ 信號處理

    這篇文章主要介紹了C++ 信號處理的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • c++讀取和寫入TXT文件的整理方法

    c++讀取和寫入TXT文件的整理方法

    今天小編就為大家分享一篇c++讀取和寫入TXT文件的整理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C++虛函數(shù)和多態(tài)超詳細分析

    C++虛函數(shù)和多態(tài)超詳細分析

    這篇文章主要介紹了C++多態(tài)的特性派生與虛函數(shù)與模板,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • 基于MFC實現(xiàn)單個文檔的文件讀寫

    基于MFC實現(xiàn)單個文檔的文件讀寫

    這篇文章主要為大家詳細介紹了如何基于MFC實現(xiàn)單個文檔的文件讀寫功能,文中的示例代碼講解詳細,對我們學習有一定幫助,感興趣的可以了解一下
    2022-07-07

最新評論

霞浦县| 芮城县| 宁河县| 商南县| 华阴市| 阿鲁科尔沁旗| 万源市| 广丰县| 沂水县| 房山区| 胶南市| 中西区| 江源县| 鸡泽县| 定西市| 黄浦区| 广灵县| 囊谦县| 宝山区| 廉江市| 老河口市| 荆州市| 龙州县| 郎溪县| 如东县| 鹤壁市| 皮山县| 左云县| 高要市| 盐山县| 泸溪县| 会泽县| 应用必备| 碌曲县| 武强县| 鹿邑县| 天津市| 垦利县| 金寨县| 井冈山市| 修武县|