亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++淺析析構(gòu)函數(shù)的特征

 更新時(shí)間:2022年07月08日 08:52:26   作者:幻荼  
既然在創(chuàng)建對(duì)象時(shí)有構(gòu)造函數(shù)(給成員初始化),那么在銷毀對(duì)象時(shí)應(yīng)該還有一個(gè)清除成員變量數(shù)據(jù)的操作咯,析構(gòu)函數(shù)與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對(duì)象的銷毀,局部對(duì)象銷毀工作是由編譯器完成的。而對(duì)象在銷毀時(shí)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成類的一些資源清理工作

定義

析構(gòu)函數(shù):與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)不是完成對(duì)象的銷毀,局部對(duì)象銷毀工作是由編譯器完成的。而對(duì)象在銷毀時(shí)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成類的一些資源清理工作

特征

1. 析構(gòu)函數(shù)名是在類名前加上字符 ~。

2. 無(wú)參數(shù)無(wú)返回值。

3. 一個(gè)類有且只有一個(gè)析構(gòu)函數(shù)。若未顯式定義,系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的析構(gòu)函數(shù)。

4. 對(duì)象生命周期結(jié)束時(shí),C++編譯系統(tǒng)系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)

舉一個(gè)例子,大家來(lái)看下面的代碼

typedef int DataType;
class SeqList
{
public:
	SeqList(int capacity = 10)
	{
		_pData = (DataType*)malloc(capacity * sizeof(DataType));
		assert(_pData);
		_size = 0;
		_capacity = capacity;
	}
private:
	int* _pData;
	size_t _size;
	size_t _capacity;
};

我們都知道一般malloc了空間之后,我們都需要用free來(lái)釋放空間。

而在實(shí)際操作當(dāng)中,我們有時(shí)候會(huì)忽略free,而直接運(yùn)行代碼。

所以為了方便我們使用,這里的析構(gòu)函數(shù),相當(dāng)于程序自動(dòng)幫你補(bǔ)了一個(gè)free出來(lái)。

具體代碼:

typedef int DataType;
class SeqList
{
public:
	SeqList(int capacity = 10)
	{
		_pData = (DataType*)malloc(capacity * sizeof(DataType));
		assert(_pData);
		_size = 0;
		_capacity = capacity;
	}
	~SeqList()
	{
		if (_pData)
		{
			free(_pData); // 釋放堆上的空間
			_pData = NULL; // 將指針置為空
			_capacity = 0;
			_size = 0;
		}
	}
private:
	int* _pData;
	size_t _size;
	size_t _capacity;
};

編譯器生成的默認(rèn)析構(gòu)函數(shù)

編譯器默認(rèn)生成的析構(gòu)函數(shù)能做些什么工作呢?我們前面已經(jīng)介紹了編譯器生成的構(gòu)造函數(shù)會(huì)去只會(huì)處理自定義類型的成員變量,那么析構(gòu)既然和構(gòu)造相對(duì)應(yīng),析構(gòu)也應(yīng)該是只去處理自定義類型的成員變量吧,確實(shí)如此,析構(gòu)函數(shù)不會(huì)對(duì)內(nèi)置類型有任何處理,只會(huì)在調(diào)用自身的析構(gòu)后再去調(diào)用自定義類型成員的析構(gòu)。

關(guān)于編譯器自動(dòng)生成的析構(gòu)函數(shù),下面的程序我們會(huì)看到,編譯器生成的析構(gòu)函數(shù),會(huì)對(duì)自定類型成員調(diào)用它的析構(gòu)函數(shù)。

class String
{
public:
	String(const char* str = "songxin")
	{
		cout << "String(const char* str = \"songxin\")" << endl;
		_str = (char*)malloc(strlen(str) + 1);
		strcpy(_str, str);
	}
	~String()
	{
		cout << "~String()" << endl;
		free(_str);
		_str = nullptr;
	}
private:
	char* _str;
};
class Person
{
public:
	Person()
		:
		_age(20),
		_name()
	{
		cout << "Person()" << endl;
	}
	
private:
	String _name;
	int _age;
};
int main()
{
	Person p;
	return 0;
}

輸出:

默認(rèn)生成的析構(gòu)函數(shù)對(duì)成員變量的處理

  • 內(nèi)置類型不處理;
  • 自定義類型成員調(diào)用相應(yīng)的析構(gòu)函數(shù);

那成員變量中的內(nèi)置類型處不處理其實(shí)都無(wú)所謂嘛,反正都要?dú)w還給操作系統(tǒng),但是有例外:

如果成員變量含有指針,并且指針指向一塊我們正使用的空間,指針也是內(nèi)置類型,那如果不釋放指針指向的那塊空間就會(huì)造成內(nèi)存泄漏,而編譯器生成的析構(gòu)函數(shù)是不會(huì)處理此情況的,因?yàn)樾枰覀冊(cè)谖鰳?gòu)函數(shù)中主動(dòng)釋放內(nèi)存,也就是說(shuō)需要我們顯式的去定義析構(gòu)函數(shù)。

class Stack
{
public:
	Stack(int capacity = 4)
		:
		_size(0),
		_capacity(capacity),
		_p(new int[_capacity])//使用new去申請(qǐng)內(nèi)存
	{
		cout << "Stack(int capacity = 4)" << endl;
	}
	~Stack()
	{
		cout << "~Stack()" << endl;
		if (_p)
		{
			delete[](_p);//釋放內(nèi)存
            _p = nullptr;
		}
		_size = _capacity = 0;
	}
private:	
	int _capacity;
	int _size;
	int* _p;
};
int main()
{
	Stack s;
	return 0;//程序結(jié)束,調(diào)用s的析構(gòu)函數(shù)
}

析構(gòu)函數(shù)無(wú)論是我們顯式定義的還是編譯器生成的,都會(huì)在對(duì)象的聲明周期結(jié)束時(shí)自動(dòng)調(diào)用,并且會(huì)調(diào)用自定義類型成員變量的析構(gòu)函數(shù)來(lái)釋放資源,而對(duì)內(nèi)置類型不做處理。

可以不顯式定義析構(gòu)函數(shù)的情況

  • 類的成員都是自定義類型的;
  • 類的成員都是非指針的內(nèi)置類型;
  • 成員有指針,但并沒(méi)有管理內(nèi)存資源;

如果類的成員變量有指針類型,并且我們讓指針指向了一塊動(dòng)態(tài)分配的空間,那么就需要我們自己寫(xiě)析構(gòu)函數(shù)了。

到此這篇關(guān)于C++淺析析構(gòu)函數(shù)的特征的文章就介紹到這了,更多相關(guān)C++析構(gòu)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Qt生成Word和PDF文檔的詳細(xì)教程

    使用Qt生成Word和PDF文檔的詳細(xì)教程

    Qt 是一個(gè)跨平臺(tái)的應(yīng)用程序開(kāi)發(fā)框架,除了用于創(chuàng)建圖形界面應(yīng)用程序外,還可以用來(lái)生成 Word 和 PDF 文檔,本文將介紹如何使用 Qt 來(lái)生成Word和PDF文檔,以及相關(guān)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • C語(yǔ)言熱門(mén)考點(diǎn)結(jié)構(gòu)體與內(nèi)存對(duì)齊詳解

    C語(yǔ)言熱門(mén)考點(diǎn)結(jié)構(gòu)體與內(nèi)存對(duì)齊詳解

    在掌握基本的結(jié)構(gòu)體使用后,我們?cè)诿嬖嚭痛笮捅荣愔谐3?huì)遇到一個(gè)熱門(mén)考點(diǎn):結(jié)構(gòu)體內(nèi)存對(duì)齊,也就是計(jì)算結(jié)構(gòu)體大小。接下來(lái)請(qǐng)跟著筆者一起來(lái)學(xué)習(xí)這塊知識(shí)點(diǎn)吧
    2021-10-10
  • C++11, 14, 17對(duì)tuple元素的訪問(wèn)詳情

    C++11, 14, 17對(duì)tuple元素的訪問(wèn)詳情

    這篇文章主要介紹了C++11, 14, 17對(duì)tuple元素的訪問(wèn)詳情,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • OpenCV中Grabcut算法的具體使用

    OpenCV中Grabcut算法的具體使用

    本文主要介紹了OpenCV中Grabcut算法的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C++中內(nèi)存池和內(nèi)存分配區(qū)Arena概念詳解

    C++中內(nèi)存池和內(nèi)存分配區(qū)Arena概念詳解

    在 C++ 中,內(nèi)存分配區(qū)(Arena)通常指的是預(yù)先分配的一大塊連續(xù)內(nèi)存空間,這種方法的主要目的是提高內(nèi)存分配和釋放的效率,下面就跟隨小編一起了解一下C++中內(nèi)存池和內(nèi)存分配區(qū)Arena相關(guān)概念吧
    2023-12-12
  • 在C++中使用HP-Socket

    在C++中使用HP-Socket

    這篇文章主要介紹了C++中簡(jiǎn)單使用HP-Socket,HP-Socket 是一套通用的高性能 TCP/UDP /HTTP 通信 框架 ,包含服務(wù)端組件、客戶端組件和 Agent 組件,廣泛適用于各種不同應(yīng)用場(chǎng)景的 TCP/UDP /HTTP 通信系統(tǒng),下面來(lái)看看更具體的介紹吧
    2021-11-11
  • VisualStudio2019構(gòu)建C/C++靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)dll的問(wèn)題 附源碼

    VisualStudio2019構(gòu)建C/C++靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)dll的問(wèn)題 附源碼

    這篇文章主要介紹了VisualStudio2019構(gòu)建C/C++靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)(dll)(文末附源碼),本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • C++ sdl實(shí)現(xiàn)渲染旋轉(zhuǎn)視頻的方法分享

    C++ sdl實(shí)現(xiàn)渲染旋轉(zhuǎn)視頻的方法分享

    一般情況下播放視頻時(shí)不需要旋轉(zhuǎn),但是如果是移動(dòng)端錄制的視頻有時(shí)會(huì)出現(xiàn)rotate參數(shù),且視頻寬高也是互換的。所以本文為大家準(zhǔn)備了利用sdl實(shí)現(xiàn)渲染旋轉(zhuǎn)視頻的方法,需要的可以參考一下
    2022-12-12
  • VScode配置C語(yǔ)言環(huán)境完整版(親測(cè)可用)

    VScode配置C語(yǔ)言環(huán)境完整版(親測(cè)可用)

    這篇文章主要介紹了VScode配置C語(yǔ)言環(huán)境完整版,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • C/C++最短路徑算法之迪杰斯特拉Dijkstra的實(shí)現(xiàn)詳解

    C/C++最短路徑算法之迪杰斯特拉Dijkstra的實(shí)現(xiàn)詳解

    Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。本文將詳解該算法的圖解與實(shí)現(xiàn),需要的可以參考一下
    2022-07-07

最新評(píng)論