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

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

t 雖然是對象,但是本質上也是局部變量,在 return 0 之前會銷毀,t 被銷毀時析構函數會被自動調用。
下面再來看一個例子:
#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;
}輸出結果如下:

析構函數的定義準則
當類中自定義了構造函數,并且構造函數中使用了系統(tǒng)資源(如∶內存申請,文件打開,等) ,則需要自定義析構函數。
下面再來看一個實驗:
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 輸出兩次,也就是說析構函數被自動調用兩次。
三、小結
- 析構函數是對象銷毀時進行清理的特殊函數
- 析構函數在對象銷毀時自動被調用
- 析構函數是對象釋放系統(tǒng)資源的保障
到此這篇關于C++深入講解對象的銷毀與析構函數的文章就介紹到這了,更多相關C++ 對象的銷毀內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

