C++深入講解對象的銷毀之析構函數(shù)
一、對象的銷毀
- 生活中的對象都是被初始化后才上市的
- 生活中的對象被銷毀前會做一些清理工作
- —股而言,需要銷毀的對象都應該做清理
解決方案
- 為每個類都提供一個 public 的 free 函數(shù)
- 對象不再需要時立即調用 free 函數(shù)進行清理
如下:

存在的問題
- free 只是一個普通的函數(shù),必須顯示的調用
- 對象銷毀前沒有做清理,很可能造成資源泄漏
C++ 編譯器是否能夠自動調用某個特殊的函數(shù)進行對象的清理?
二、析構函數(shù)
C++ 的類中可以定義一個特殊的清理函數(shù)
- 這個特殊的清理函數(shù)叫做析構函數(shù)
- 析構函數(shù)的功能與構造函數(shù)相反
定義:~ClassName()
- 析構函數(shù)沒有參數(shù)也沒有返回值類型聲明
- 析構函數(shù)在對象銷毀時自動被調用
下面開始簡單使用析構函數(shù):
#include <stdio.h>
class Test
{
public:
Test()
{
printf("Test()\n");
}
~Test()
{
printf("~Test()\n");
}
};
int main()
{
Test t;
return 0;
}輸出結果如下:

t 雖然是對象,但是本質上也是局部變量,在 return 0 之前會銷毀,t 被銷毀時析構函數(shù)會被自動調用。
下面再來看一個例子:
#include <stdio.h>
class Test
{
int mi;
public:
Test(int i)
{
mi = i;
printf("Test(): %d\n", mi);
}
~Test()
{
printf("~Test(): %d\n", mi);
}
};
int main()
{
Test t(1);
Test* pt = new Test(2);
delete pt;
return 0;
}輸出結果如下:

析構函數(shù)的定義準則
當類中自定義了構造函數(shù),并且構造函數(shù)中使用了系統(tǒng)資源(如∶內(nèi)存申請,文件打開,等) ,則需要自定義析構函數(shù)。
下面再來看一個實驗:
IntArray.h:
#ifndef _INTARRAY_H_
#define _INTARRAY_H_
class IntArray
{
private:
int m_length;
int* m_pointer;
public:
IntArray(int len);
IntArray(const IntArray& obj);
int length();
bool get(int index, int& value);
bool set(int index ,int value);
~IntArray();
};
#endifIntArray.cpp:
#include "IntArray.h"
#include "stdio.h"
IntArray::IntArray(int len)
{
m_pointer = new int[len];
for(int i=0; i<len; i++)
{
m_pointer[i] = 0;
}
m_length = len;
}
IntArray::IntArray(const IntArray& obj)
{
m_length = obj.m_length;
m_pointer = new int[obj.m_length];
for(int i=0; i<obj.m_length; i++)
{
m_pointer[i] = obj.m_pointer[i];
}
}
int IntArray::length()
{
return m_length;
}
bool IntArray::get(int index, int& value)
{
bool ret = (0 <= index) && (index < length());
if( ret )
{
value = m_pointer[index];
}
return ret;
}
bool IntArray::set(int index, int value)
{
bool ret = (0 <= index) && (index < length());
if( ret )
{
m_pointer[index] = value;
}
return ret;
}
IntArray::~IntArray()
{
printf("do it\n");
delete[]m_pointer;
}main.cpp:
#include <stdio.h>
#include "IntArray.h"
int main()
{
IntArray a(5);
for(int i=0; i<a.length(); i++)
{
a.set(i, i + 1);
}
for(int i=0; i<a.length(); i++)
{
int value = 0;
if( a.get(i, value) )
{
printf("a[%d] = %d\n", i, value);
}
}
IntArray b = a;
for(int i=0; i<b.length(); i++)
{
int value = 0;
if( b.get(i, value) )
{
printf("b[%d] = %d\n", i, value);
}
}
return 0;
}輸出結果如下:

可以看到 do it 輸出兩次,也就是說析構函數(shù)被自動調用兩次。
三、小結
- 析構函數(shù)是對象銷毀時進行清理的特殊函數(shù)
- 析構函數(shù)在對象銷毀時自動被調用
- 析構函數(shù)是對象釋放系統(tǒng)資源的保障
到此這篇關于C++深入講解對象的銷毀與析構函數(shù)的文章就介紹到這了,更多相關C++ 對象的銷毀內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
openCV4.1.1+VS2019環(huán)境配置詳解
這篇文章主要介紹了openCV4.1.1+VS2019環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
詳解C++中typedef 和 #define 的區(qū)別
這篇文章主要介紹了C++中typedef 與 #define 的區(qū)別,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
結合C++11的新特性來解析C++中的枚舉與聯(lián)合
這篇文章主要介紹了C++編程中的枚舉與聯(lián)合,結合了范圍(或強類型)enum class類型等C++11的新特性來講解,需要的朋友可以參考下2016-01-01
詳解C++數(shù)組和數(shù)組名問題(指針、解引用)
這篇文章主要介紹了詳解C++數(shù)組和數(shù)組名問題(指針、解引用),指針的實質就是個變量,它跟普通變量沒有任何本質區(qū)別,指針本身是一個對象,同時指針無需在定義的時候賦值,具體內(nèi)容詳情跟隨小編一起看看吧2021-09-09

