weidagang2046的專欄

          物格而后知致
          隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
          數據加載中……

          深析C++析構函數

          華南理工大學計算機研究所北區研發二部 袁凱

          所有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中測試,內存泄漏對于一個高效的服務程序來說十分重要。我想可能大家也可能出現過這種問題,所以寫出這篇文章,希望能給大家帶來幫助。文章寫的倉促,有錯別字或錯誤請大家多包涵。歡迎和大家交流。
          轉自:http://www.ccw.com.cn/htm/app/aprog/01_9_25_2.asp

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

          主站蜘蛛池模板: 连城县| 博白县| 盐边县| 五台县| 秦安县| 扎兰屯市| 汉源县| 疏附县| 疏勒县| 昔阳县| 乌兰察布市| 商都县| 徐汇区| 遂昌县| 赤峰市| 清徐县| 西和县| 佛冈县| 诸暨市| 黄大仙区| 定西市| 湖州市| 勃利县| 治多县| 隆回县| 兰考县| 岚皋县| 邯郸市| 桂林市| 定州市| 清流县| 民权县| 阿克| 洞头县| 洛宁县| 永新县| 万州区| 洛扎县| 大关县| 同仁县| 瑞丽市|