weidagang2046的專(zhuān)欄

          物格而后知致
          隨筆 - 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)用。這里我不說(shuō)這些常用方法,若不知可參考C++書(shū)籍。而我這次所想說(shuō)的是較微妙的技巧,常不被人注意,但卻非常非常的重要。看以下代碼:
          //\\////\\////\\////\\////\\////\\//\\////\\////\\//
          //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;
          }
          你能看出什么問(wèn)題嗎?很顯然,有內(nèi)存泄漏。這是因?yàn)楫?dāng)刪除pCFun時(shí),它只調(diào)用了Cfunction的析構(gòu)函數(shù)而沒(méi)調(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;
          }
          你能看出什么問(wèn)題嗎?這里CfunctionEx和Cfunction中本身并沒(méi)有分配內(nèi)存,應(yīng)該不會(huì)有內(nèi)存泄漏。和上例一樣當(dāng)刪除pCFun時(shí),它只調(diào)用了Cfunction的析構(gòu)函數(shù)而沒(méi)調(diào)用CfunctionEx的析構(gòu)函數(shù),但CfunctionEx本身并沒(méi)分配內(nèi)存,是什么地方有內(nèi)存泄漏我不說(shuō)大家也應(yīng)該知道了吧。不錯(cuò)是m_cbase,因?yàn)樗荂base的實(shí)例且是CfunctionEx成員變量,當(dāng)CfunctionEx的的析構(gòu)函數(shù)沒(méi)有被調(diào)用時(shí),當(dāng)然m_cbase的析構(gòu)函數(shù)也沒(méi)有被調(diào)用,所以Cbase中分配的內(nèi)存被泄漏。
          解決以上問(wèn)題的方法很簡(jiǎn)單,就是使基類(lèi)Cfunction的析構(gòu)函數(shù)為虛函數(shù)就可以了。很簡(jiǎn)單,是嗎?哈哈……
          這樣就得出一個(gè)結(jié)論,當(dāng)你的基類(lèi)的析構(gòu)函數(shù)不為虛的話(huà),
          1.1 其子類(lèi)中所分配的內(nèi)存將可能泄漏。
          2.2 其子類(lèi)中所有的成員變量的類(lèi)中分配的內(nèi)存也將可能泄漏。
          第二點(diǎn)非常重要,因?yàn)楹苋菀妆贿z漏。我就是為此這才寫(xiě)此文。
          這里說(shuō)的可能是因?yàn)椋绻绦蛑袥](méi)有以上示例類(lèi)似寫(xiě)法(指用基類(lèi)指針指向子類(lèi)實(shí)例裕,虛函數(shù)是C++的精華,很少有人不用的,由其是在大中型軟件項(xiàng)目中),就不會(huì)出現(xiàn)本文所說(shuō)的內(nèi)存泄漏。看來(lái)在基類(lèi)中使析構(gòu)函數(shù)為虛函數(shù)是如此的重要。所以強(qiáng)烈建議在基類(lèi)中把析構(gòu)函數(shù)聲明為虛函數(shù),但是只有你寫(xiě)的類(lèi)并不做為基類(lèi)時(shí)例外。
          以上我在工作中碰到的問(wèn)題,程序在VC++6中測(cè)試,內(nèi)存泄漏對(duì)于一個(gè)高效的服務(wù)程序來(lái)說(shuō)十分重要。我想可能大家也可能出現(xiàn)過(guò)這種問(wèn)題,所以寫(xiě)出這篇文章,希望能給大家?guī)?lái)幫助。文章寫(xiě)的倉(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 閱讀(291) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): C/C++

          主站蜘蛛池模板: 保定市| 绥德县| 金沙县| 嘉荫县| 蒙阴县| 德安县| 拉孜县| 郁南县| 杨浦区| 金阳县| 湟中县| 建平县| 客服| 临桂县| 吉首市| 夹江县| 亚东县| 镇平县| 兴山县| 平远县| 丽江市| 策勒县| 昆明市| 景德镇市| 松阳县| 鄂托克旗| 若羌县| 自贡市| 鄂托克前旗| 康马县| 鄂伦春自治旗| 大同县| 通山县| 紫云| 什邡市| 城固县| 迁西县| 柳河县| 京山县| 隆子县| 铜川市|