深析C++的解構函式-Good Practice: 將基類的解構函式聲明為虛函數

來源:互聯網
上載者:User
所有C++程式員對解構函式都不陌生,由於其簡單且易理解,所以都能很快應用。這裡我不說這些常用方法,若不知可參考C++書籍。而我這次所想說的是較微妙的技巧,常不被人注意,但卻非常非常的重要。看以下代碼:
//\\////\\////\\////\\////\\////\\//\\////\\////\\//
//Example 1
//author: 袁凱
//date: 2001-09-24
//\\////\\////\\////\\////\\////\\//\\////\\////\\//

#include <iostream.h>

class CFunction
{
public:
CFunction()
{
data = new char[64];
};
~CFunction()
{
delete [] data;
};
char *data;
};

class CFunctionEx : public CFunction
{
public:
CFunctionEx()
{
m_data = new char[64];
};
~CFunctionEx()
{
delete [] m_data;
};
private:
char *m_data;
};

void main()
{
CFunction *pCFun = new CFunctionEx;
delete pCFun;
}
你能看出什麼問題嗎?很顯然,有記憶體流失。這是因為當刪除pCFun時,它只調用了Cfunction的解構函式而沒調用CfunctionEx的解構函式,所以導致記憶體流失。再看下例:
//\\////\\////\\////\\////\\////\\//\\////\\////\\//
//Example 2
//author: 袁凱
//date: 2001-09-24
//\\////\\////\\////\\////\\////\\//\\////\\////\\//
#include <iostream.h>
class CBase
{
public:
CBase()
{
data = new char[64];
};
~CBase()
{
delete [] data;
};
char *data;
};
class CFunction
{
public:
CFunction(){};
~CFunction(){};
};
class CFunctionEx : public CFunction
{
public:
CFunctionEx(){};
~CFunctionEx(){};
private:
CBase m_cbase;
};
void main()
{
CFunction *pCFun = new CFunctionEx;
delete pCFun;
}
你能看出什麼問題嗎?這裡CfunctionEx和Cfunction中本身並沒有分配記憶體,應該不會有記憶體流失。和上例一樣當刪除pCFun 時,它只調用了Cfunction的解構函式而沒調用CfunctionEx的解構函式,但CfunctionEx本身並沒分配記憶體,是什麼地方有記憶體泄 漏我不說大家也應該知道了吧。不錯是m_cbase,因為它是Cbase的執行個體且是CfunctionEx成員變數,當CfunctionEx的的析構函 數沒有被調用時,當然m_cbase的解構函式也沒有被調用,所以Cbase中分配的記憶體被泄漏。
解決以上問題的方法很簡單,就是使基類Cfunction的解構函式為虛函數就可以了。很簡單,是嗎?哈哈……
這樣就得出一個結論,當你的基類的解構函式不為虛的話,
1.1 其子類中所分配的記憶體將可能泄漏。
2.2 其子類中所有的成員變數的類中分配的記憶體也將可能泄漏。
第二點非常重要,因為很容易被遺漏。我就是為此這才寫此文。
這裡說的可能是因為,如果程式中沒有以上樣本類似寫法(指用基類指標指向子類執行個體裕,虛函數是C++的精華,很少有人不用的,由其是在大中型軟體 項目中),就不會出現本文所說的記憶體流失。看來在基類中使解構函式為虛函數是如此的重要。所以強烈建議在基類中把解構函式聲明為虛函數,但是只有你寫的類 並不做為基類時例外。
以上我在工作中碰到的問題,程式在VC++6中測試,記憶體流失對於一個高效的服務程式來說十分重要。我想可能大家也可能出現過這種問題,所以寫出這篇文章,希望能給大家帶來協助。文章寫的倉促,有錯別字或錯誤請大家多包涵。歡迎和大家交流。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.