青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用鏈接

留言簿(8)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 

1、 問題闡述

      一個大型的C++程序中最容易出現,也是最頭疼的一個問題就是內存泄露,即忘記釋放已經申請的內存,造成程序占用的內存不斷上升,系統性能不斷下降,甚至造成內存耗盡而導致程序崩潰。在Java中提供自動垃圾回收機制,程序在何時的時機將回收內存,C++語言一直沒有將這種機制作為語言的內部機制,但是它也提供了足夠的靈活機制,使開發人員有效地避免內存泄露。

2、 內部封裝

      可以將分配和釋放的過程封裝到一個類中,即在構造的時候申請內存,析構的時候釋放內存,從而保證沒有內存泄露。下面是一個簡單的封裝類。

#include <iostream>
#include 
<cstring>
using namespace std;
class AutoNewDel
{
private:
    
char* m_szBuf;
    unsigned 
int m_nSize;
public:
    AutoNewDel(unsigned 
int n=1)
    
{
        m_szBuf
=new char[n];
        m_nSize
=n;
    }
;
    
~AutoNewDel()
    
{
        
if(m_szBuf!=NULL)    //提供安全機制
        {
            delete[] m_szBuf;    
//刪除字符數組
            m_szBuf=NULL;    //防止出現野指針
        }

    }
;
    
char* GetBuf()
    
{
        
return m_szBuf;
    }
;
}
;
void fun()
{
    AutoNewDel tmpObj(
100);
    
char* p= tmpObj.GetBuf();
    strcpy(p,
"one world, one dream");
    cout
<<p<<endl;
}

int main()
{
    fun();
    cout
<<"exit main"<<endl;
    
return 0;
}

      在這個例子中,封裝了char類型的內存分配和刪除,當聲明對象tmpObj時,即可獲得相應的內存,而且這個內存再tmpObj對象的作用域推出時自動釋放,不需要開發人員顯示的調用delete來釋放了,避免了由于忘記釋放內存而引起的內存泄露錯誤。
      本例給出了一個最基本的思路,但是還是存在很多問題的,比如復制構造函數和復制的問題。下面將演示這個例子的不足,修改函數fun(),增加一個賦值語句,如下:
void fun()
{
    AutoNewDel tmpObj(
100);
    AutoNewDel tmpObj2
=tmpObj;//這里是增加的語句
    char* p= tmpObj.GetBuf();
    strcpy(p,
"one world, one dream");
    cout
<<p<<endl;
}
      在這個類中并沒有實現復制構造函數,因此編譯器自動構造一個默認的復制構造函數,執行位復制操作,即將對象tmpObj的內容逐字地復制到對象tmpObj2中,兩個對象中的m_szBuf指向同一塊內存,當對象銷毀時,m_szBuf會被銷毀兩次,從而造成程序錯誤(本博客還有一篇隨筆說明相關的內容,隨筆地址為:C++ primer plus第十一章 使用類的程序。簡單的解決辦法就是禁止復制構造函數,在類中聲明復制構造函數為私有。但是這樣治標不治本,它限制類的功能實現。可以通過一個引用一個計數的方法,即避免了對同一塊內存的多次刪除,也允許復制構造函數。
      
      引用的計數的原理是這樣的,就是對要使用的內存維護一個計數器,記錄當前有多少指針指向這塊內存。當有指針指向這塊內存時,計數器加1;反之,當指向這塊內存指針銷毀時,計數器減1。當這塊內存的計數器為0時,才允許刪除這塊內存。可以在類的構造函數和析構函數中分別完成加1和減1的操作。代碼如下:
#include <iostream>
#include 
<cstring>
using namespace std;
class AutoNewDel
{
// Attribute
private:
    
char* m_szBuf;
    unsigned 
int m_nSize;
    
int * m_count;    //新增加的語句
public:
    AutoNewDel(unsigned 
int n=1)//在構造函數中申請內存
    {
        m_szBuf
=new char[n];
        m_nSize
=n;
        
//新增加的語句
        m_count=new int;
        
*m_count=1;
        cout
<<"count is : "<<*m_count<<endl;
    }
;
    
//新增加的復制構造函數
    AutoNewDel(const AutoNewDel & s)
    
{
        m_nSize
=s.m_nSize;
        m_szBuf
=s.m_szBuf;
        m_count
=s.m_count;
        (
*m_count)++;
        cout
<<"count is : "<<*m_count<<endl;
    }

    
~AutoNewDel()
    
{
        (
*m_count)--;
        cout
<<"count is : "<<*m_count<<endl;//新增加的兩條語句
        
        
if(*m_count==0)
        
{
            cout
<<"buf is deleted"<<endl;
            
if(m_szBuf!=NULL)    //提供安全機制
            {
                delete[] m_szBuf;    
//刪除字符數組
                m_szBuf=NULL;    //防止出現野指針
                if(m_count!=NULL)
                
{
                    delete m_count;
                    m_count
=NULL;
                }

            }

        }

    }
;
    
char* GetBuf()
    
{
        
return m_szBuf;
    }
;
}
;
void fun()
{
    AutoNewDel tmpObj(
100);
    
char* p= tmpObj.GetBuf();
    strcpy(p,
"one world, one dream");
    cout
<<p<<endl;

    AutoNewDel tmpObj2
=tmpObj;
    cout
<<"tmpObj2.m_szBuf = "<<tmpObj2.GetBuf()<<endl;
}

int main()
{
    fun();
    cout
<<"exit main"<<endl;
    
return 0;
}

程序輸出結果如下:


想要獲得更多內容,可點擊:《Visuanl C++代碼參考與技巧大全》學習筆記——索引隨筆
posted on 2010-02-15 14:41 煙皚 閱讀(3241) 評論(0)  編輯 收藏 引用 所屬分類: 《Visual C++代碼參考與技巧大全》學習筆記
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区国产日产| 久久精品国产综合精品| 亚洲一区久久| 在线播放中文字幕一区| 国产精品综合网站| 国产亚洲日本欧美韩国| 国产亚洲毛片在线| 亚洲国产精品久久久久婷婷884 | 亚洲图片在线观看| 午夜影院日韩| 美女成人午夜| 99在线精品视频在线观看| 亚洲精品一区在线| 亚洲欧美国产日韩中文字幕| 亚洲欧美国产77777| 久久这里只有精品视频首页| 亚洲国产精彩中文乱码av在线播放| 亚洲人成在线播放网站岛国| 亚洲一区二区三区在线看| 性色av一区二区三区在线观看| 麻豆国产va免费精品高清在线| 国产精品第一区| 亚洲欧洲日本在线| 久久国产乱子精品免费女 | 久久久久免费视频| 国产精品久久久久久久久婷婷| 亚洲国产欧美一区二区三区丁香婷| 午夜视频一区在线观看| 亚洲日韩视频| 欧美日韩国产专区| 日韩视频一区二区三区在线播放免费观看 | 欧美+日本+国产+在线a∨观看| 国产欧美亚洲一区| 欧美在线看片a免费观看| 狠狠色噜噜狠狠色综合久| 亚洲欧美成人在线| 欧美一区二区三区免费观看| 一本大道久久a久久精品综合| 亚洲一级电影| 一区二区三区产品免费精品久久75| 欧美不卡一区| 欧美一区二区视频在线观看| 欧美激情bt| 欧美成人综合在线| 亚洲美女黄网| 亚洲性av在线| 一区福利视频| 久久视频这里只有精品| 欧美高清日韩| 久久影视精品| 国产精品影视天天线| 欧美成人精品福利| 国产欧美日韩在线视频| 亚洲麻豆国产自偷在线| 影音先锋久久资源网| 亚洲综合色噜噜狠狠| 亚洲激情电影在线| 麻豆精品国产91久久久久久| 国产精品久久久久久影视| 午夜精品一区二区三区在线视 | 国产精品热久久久久夜色精品三区| 久久久久久有精品国产| 欧美日韩免费一区二区三区| 欧美一区二区三区的| 欧美日韩裸体免费视频| 91久久久亚洲精品| 亚洲国产激情| 亚洲国产欧美一区二区三区久久 | 久久av一区二区| 亚洲欧美日韩国产成人精品影院| 欧美大胆成人| 亚洲第一精品影视| 亚洲欧美日韩区| 亚洲视频综合在线| 欧美ed2k| 亚洲专区免费| 亚洲国产你懂的| 91久久久国产精品| 亚洲伦伦在线| 亚洲欧美一区二区三区久久| 亚洲欧美视频在线| 免费久久99精品国产自| 欧美黄色一区二区| 99re视频这里只有精品| 亚洲一区二区三区精品在线| 午夜精品av| 欧美高清影院| 蜜臀av在线播放一区二区三区| 欧美风情在线| 亚洲欧美三级伦理| 免费影视亚洲| 国产色综合久久| 亚洲日本一区二区| 亚洲一区二区三区在线播放| 久久久xxx| 一本色道久久99精品综合| 久久精品av麻豆的观看方式| 欧美男人的天堂| 在线免费日韩片| 久久国产精品久久久久久| 亚洲激情社区| 亚洲免费中文字幕| 欧美高清在线精品一区| 久久狠狠婷婷| 国产亚洲欧美在线| 久久大逼视频| 午夜久久黄色| 国产人妖伪娘一区91| 亚洲一区二区网站| 999亚洲国产精| 欧美日韩精品三区| 亚洲天堂成人在线视频| 亚洲福利视频一区二区| 久久亚洲免费| 亚洲专区一区| 狠狠色伊人亚洲综合成人| 欧美中文在线免费| 午夜精品亚洲| 国产欧美日韩高清| 欧美在线视频在线播放完整版免费观看| 99精品国产福利在线观看免费| 欧美高清在线视频观看不卡| 亚洲视频每日更新| 亚洲专区欧美专区| 国产日韩精品视频一区| 葵司免费一区二区三区四区五区| 久久精品亚洲一区| 亚洲精品一线二线三线无人区| 亚洲精品黄网在线观看| 国产精品久久久久久久久借妻| 欧美一区二区三区免费视频| 久久天堂成人| 欧美屁股在线| 久久精视频免费在线久久完整在线看| 欧美自拍偷拍午夜视频| 亚洲精品一区久久久久久| 午夜精品一区二区三区在线视 | 欧美激情久久久久| 香蕉成人久久| 欧美日韩第一区| 欧美国产日韩亚洲一区| 国产一区二区精品在线观看| 亚洲美洲欧洲综合国产一区| 樱桃成人精品视频在线播放| 亚洲美女av网站| 亚洲精品日韩在线| 欧美大片在线观看一区二区| 久久这里有精品视频| 国产精品福利片| 亚洲精品久久久久久久久久久| 亚洲第一网站免费视频| 久久精品一区二区三区四区 | 国产精品国产三级国产普通话99 | 亚洲激情网站免费观看| 在线国产精品一区| 久久精品1区| 亚洲成色精品| 一区二区激情视频| 国产精品国产a级| 亚洲男女自偷自拍图片另类| 久久xxxx精品视频| 国产一区清纯| 欧美a级大片| 一区二区三区色| 久久深夜福利| 亚洲天堂视频在线观看| 国产精品一区=区| 女女同性女同一区二区三区91| 日韩视频免费观看| 亚洲一区二区在线免费观看视频| 国产精品大片wwwwww| 久久综合狠狠综合久久综青草| 亚洲福利精品| 欧美www在线| 亚洲欧美日韩在线高清直播| 欧美激情精品久久久久久蜜臀 | 好看不卡的中文字幕| 久久蜜桃精品| 亚洲视频二区| 亚洲精品乱码久久久久久黑人 | 欧美精品电影在线| 久久九九国产精品| 亚洲午夜未删减在线观看| 美日韩免费视频| 久久成人在线| 欧美在线播放| 亚洲欧美国产精品桃花| 亚洲黄色三级| 亚洲黄色在线观看| 含羞草久久爱69一区| 国产欧美日韩在线观看| 国产精品国产自产拍高清av| 久久婷婷丁香| 久久午夜精品一区二区| 久久成人精品| 久久婷婷成人综合色| 午夜精品久久久久久久白皮肤| 99精品国产在热久久婷婷| 亚洲人成毛片在线播放女女| 亚洲大片在线观看|