<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評(píng)論 - 101, 引用 - 0
    數(shù)據(jù)加載中……

    深析C++析構(gòu)函數(shù)

    華南理工大學(xué)計(jì)算機(jī)研究所北區(qū)研發(fā)二部 袁凱

    所有C++程序員對(duì)析構(gòu)函數(shù)都不陌生,由于其簡(jiǎn)單且易理解,所以都能很快應(yīng)用。這里我不說這些常用方法,若不知可參考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;
    }
    你能看出什么問題嗎?很顯然,有內(nèi)存泄漏。這是因?yàn)楫?dāng)刪除pCFun時(shí),它只調(diào)用了Cfunction的析構(gòu)函數(shù)而沒調(diào)用CfunctionEx的析構(gòu)函數(shù),所以導(dǎo)致內(nèi)存泄漏。再看下例:
    //\\////\\////\\////\\////\\////\\//\\////\\////\\//
    //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中本身并沒有分配內(nèi)存,應(yīng)該不會(huì)有內(nèi)存泄漏。和上例一樣當(dāng)刪除pCFun時(shí),它只調(diào)用了Cfunction的析構(gòu)函數(shù)而沒調(diào)用CfunctionEx的析構(gòu)函數(shù),但CfunctionEx本身并沒分配內(nèi)存,是什么地方有內(nèi)存泄漏我不說大家也應(yīng)該知道了吧。不錯(cuò)是m_cbase,因?yàn)樗荂base的實(shí)例且是CfunctionEx成員變量,當(dāng)CfunctionEx的的析構(gòu)函數(shù)沒有被調(diào)用時(shí),當(dāng)然m_cbase的析構(gòu)函數(shù)也沒有被調(diào)用,所以Cbase中分配的內(nèi)存被泄漏。
    解決以上問題的方法很簡(jiǎn)單,就是使基類Cfunction的析構(gòu)函數(shù)為虛函數(shù)就可以了。很簡(jiǎn)單,是嗎?哈哈……
    這樣就得出一個(gè)結(jié)論,當(dāng)你的基類的析構(gòu)函數(shù)不為虛的話,
    1.1 其子類中所分配的內(nèi)存將可能泄漏。
    2.2 其子類中所有的成員變量的類中分配的內(nèi)存也將可能泄漏。
    第二點(diǎn)非常重要,因?yàn)楹苋菀妆贿z漏。我就是為此這才寫此文。
    這里說的可能是因?yàn)椋绻绦蛑袥]有以上示例類似寫法(指用基類指針指向子類實(shí)例裕,虛函數(shù)是C++的精華,很少有人不用的,由其是在大中型軟件項(xiàng)目中),就不會(huì)出現(xiàn)本文所說的內(nèi)存泄漏。看來在基類中使析構(gòu)函數(shù)為虛函數(shù)是如此的重要。所以強(qiáng)烈建議在基類中把析構(gòu)函數(shù)聲明為虛函數(shù),但是只有你寫的類并不做為基類時(shí)例外。
    以上我在工作中碰到的問題,程序在VC++6中測(cè)試,內(nèi)存泄漏對(duì)于一個(gè)高效的服務(wù)程序來說十分重要。我想可能大家也可能出現(xiàn)過這種問題,所以寫出這篇文章,希望能給大家?guī)韼椭N恼聦懙膫}(cāng)促,有錯(cuò)別字或錯(cuò)誤請(qǐng)大家多包涵。歡迎和大家交流。
    轉(zhuǎn)自:http://www.ccw.com.cn/htm/app/aprog/01_9_25_2.asp

    posted on 2005-05-12 11:24 weidagang2046 閱讀(288) 評(píng)論(0)  編輯  收藏 所屬分類: C/C++

    主站蜘蛛池模板: 亚洲精品乱码久久久久久自慰| 亚洲一区二区三区91| 97在线视频免费| 亚洲欧美第一成人网站7777 | 精品亚洲av无码一区二区柚蜜| 精品亚洲一区二区三区在线观看| 免费女人高潮流视频在线观看| 亚洲成AV人片高潮喷水| 中文字幕精品亚洲无线码二区| 可以免费看的卡一卡二| a高清免费毛片久久| 亚洲AV无码成人专区| 亚洲色无码专区在线观看| 女人18毛片特级一级免费视频 | 亚洲国产精品网站在线播放 | 亚洲国产精品成人网址天堂| 最近免费2019中文字幕大全| 特级毛片aaaa级毛片免费| 亚洲经典在线中文字幕| 亚洲国产一区二区视频网站| 可以免费看的卡一卡二| 中文在线观看永久免费| 亚洲AV香蕉一区区二区三区| 亚洲视频免费一区| 亚洲欧洲精品无码AV| 国产成人免费片在线观看| 4444www免费看| 99久久99这里只有免费的精品| 亚洲中文字幕无码中文| 亚洲成人午夜在线| 国产亚洲视频在线播放| 免费午夜爽爽爽WWW视频十八禁| 亚洲毛片在线免费观看| 免费黄色电影在线观看| 72pao国产成视频永久免费| 亚洲AV成人无码网天堂| 亚洲一级免费毛片| 亚洲福利电影一区二区?| 亚洲AV乱码一区二区三区林ゆな| 久久精品国产亚洲AV不卡| 免费一级毛片免费播放|