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

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用鏈接

留言簿(8)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

 

1、 問(wèn)題闡述

      一個(gè)大型的C++程序中最容易出現(xiàn),也是最頭疼的一個(gè)問(wèn)題就是內(nèi)存泄露,即忘記釋放已經(jīng)申請(qǐng)的內(nèi)存,造成程序占用的內(nèi)存不斷上升,系統(tǒng)性能不斷下降,甚至造成內(nèi)存耗盡而導(dǎo)致程序崩潰。在Java中提供自動(dòng)垃圾回收機(jī)制,程序在何時(shí)的時(shí)機(jī)將回收內(nèi)存,C++語(yǔ)言一直沒(méi)有將這種機(jī)制作為語(yǔ)言的內(nèi)部機(jī)制,但是它也提供了足夠的靈活機(jī)制,使開(kāi)發(fā)人員有效地避免內(nèi)存泄露。

2、 內(nèi)部封裝

      可以將分配和釋放的過(guò)程封裝到一個(gè)類(lèi)中,即在構(gòu)造的時(shí)候申請(qǐng)內(nèi)存,析構(gòu)的時(shí)候釋放內(nèi)存,從而保證沒(méi)有內(nèi)存泄露。下面是一個(gè)簡(jiǎn)單的封裝類(lèi)。

#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)    //提供安全機(jī)制
        {
            delete[] m_szBuf;    
//刪除字符數(shù)組
            m_szBuf=NULL;    //防止出現(xiàn)野指針
        }

    }
;
    
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;
}

      在這個(gè)例子中,封裝了char類(lèi)型的內(nèi)存分配和刪除,當(dāng)聲明對(duì)象tmpObj時(shí),即可獲得相應(yīng)的內(nèi)存,而且這個(gè)內(nèi)存再tmpObj對(duì)象的作用域推出時(shí)自動(dòng)釋放,不需要開(kāi)發(fā)人員顯示的調(diào)用delete來(lái)釋放了,避免了由于忘記釋放內(nèi)存而引起的內(nèi)存泄露錯(cuò)誤。
      本例給出了一個(gè)最基本的思路,但是還是存在很多問(wèn)題的,比如復(fù)制構(gòu)造函數(shù)和復(fù)制的問(wèn)題。下面將演示這個(gè)例子的不足,修改函數(shù)fun(),增加一個(gè)賦值語(yǔ)句,如下:
void fun()
{
    AutoNewDel tmpObj(
100);
    AutoNewDel tmpObj2
=tmpObj;//這里是增加的語(yǔ)句
    char* p= tmpObj.GetBuf();
    strcpy(p,
"one world, one dream");
    cout
<<p<<endl;
}
      在這個(gè)類(lèi)中并沒(méi)有實(shí)現(xiàn)復(fù)制構(gòu)造函數(shù),因此編譯器自動(dòng)構(gòu)造一個(gè)默認(rèn)的復(fù)制構(gòu)造函數(shù),執(zhí)行位復(fù)制操作,即將對(duì)象tmpObj的內(nèi)容逐字地復(fù)制到對(duì)象tmpObj2中,兩個(gè)對(duì)象中的m_szBuf指向同一塊內(nèi)存,當(dāng)對(duì)象銷(xiāo)毀時(shí),m_szBuf會(huì)被銷(xiāo)毀兩次,從而造成程序錯(cuò)誤(本博客還有一篇隨筆說(shuō)明相關(guān)的內(nèi)容,隨筆地址為:C++ primer plus第十一章 使用類(lèi)的程序。簡(jiǎn)單的解決辦法就是禁止復(fù)制構(gòu)造函數(shù),在類(lèi)中聲明復(fù)制構(gòu)造函數(shù)為私有。但是這樣治標(biāo)不治本,它限制類(lèi)的功能實(shí)現(xiàn)。可以通過(guò)一個(gè)引用一個(gè)計(jì)數(shù)的方法,即避免了對(duì)同一塊內(nèi)存的多次刪除,也允許復(fù)制構(gòu)造函數(shù)。
      
      引用的計(jì)數(shù)的原理是這樣的,就是對(duì)要使用的內(nèi)存維護(hù)一個(gè)計(jì)數(shù)器,記錄當(dāng)前有多少指針指向這塊內(nèi)存。當(dāng)有指針指向這塊內(nèi)存時(shí),計(jì)數(shù)器加1;反之,當(dāng)指向這塊內(nèi)存指針?shù)N毀時(shí),計(jì)數(shù)器減1。當(dāng)這塊內(nèi)存的計(jì)數(shù)器為0時(shí),才允許刪除這塊內(nèi)存。可以在類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)中分別完成加1和減1的操作。代碼如下:
#include <iostream>
#include 
<cstring>
using namespace std;
class AutoNewDel
{
// Attribute
private:
    
char* m_szBuf;
    unsigned 
int m_nSize;
    
int * m_count;    //新增加的語(yǔ)句
public:
    AutoNewDel(unsigned 
int n=1)//在構(gòu)造函數(shù)中申請(qǐng)內(nèi)存
    {
        m_szBuf
=new char[n];
        m_nSize
=n;
        
//新增加的語(yǔ)句
        m_count=new int;
        
*m_count=1;
        cout
<<"count is : "<<*m_count<<endl;
    }
;
    
//新增加的復(fù)制構(gòu)造函數(shù)
    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;//新增加的兩條語(yǔ)句
        
        
if(*m_count==0)
        
{
            cout
<<"buf is deleted"<<endl;
            
if(m_szBuf!=NULL)    //提供安全機(jī)制
            {
                delete[] m_szBuf;    
//刪除字符數(shù)組
                m_szBuf=NULL;    //防止出現(xiàn)野指針
                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;
}

程序輸出結(jié)果如下:


想要獲得更多內(nèi)容,可點(diǎn)擊:《Visuanl C++代碼參考與技巧大全》學(xué)習(xí)筆記——索引隨筆
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国内外成人免费激情在线视频网站| 狠狠88综合久久久久综合网| 免费成人黄色av| 国产日韩一级二级三级| 中日韩美女免费视频网址在线观看 | 久久久久久电影| 久久精品动漫| 午夜国产精品视频免费体验区| 国产亚洲精品aa午夜观看| 欧美精品久久久久久| 欧美精品自拍| 久久精品123| 欧美在线播放一区二区| 亚洲一级特黄| 久久久久久久久久久久久9999| 99re在线精品| 欧美伊人久久大香线蕉综合69| 亚洲欧美中文日韩在线| 亚洲免费成人av电影| 国产精品久久久久高潮| 久久久久久久国产| 欧美精品一区二区三| 亚洲视频专区在线| 欧美专区在线播放| 亚洲激情av| 亚洲国产综合在线看不卡| 亚洲天堂免费观看| 蜜桃精品久久久久久久免费影院| 这里只有精品电影| 欧美亚洲自偷自偷| 久久久国产一区二区| 亚洲欧美美女| 欧美国内亚洲| 浪潮色综合久久天堂| 一本大道久久a久久精品综合 | 欧美在线精品免播放器视频| 国产免费一区二区三区香蕉精| 亚洲欧洲另类国产综合| 亚洲欧美日韩第一区| 久久国产福利| 国产精品久久久久久久午夜片| 国产一区亚洲| 午夜精品三级视频福利| 亚洲综合色婷婷| 狠狠色综合色综合网络| 午夜伦理片一区| 亚洲激情第一区| 久久久久国产一区二区| 欧美三级网址| 亚洲伦理网站| 久久亚洲午夜电影| 国产精品高潮呻吟久久| 日韩视频三区| 欧美人妖另类| 久久久99久久精品女同性| 亚洲无人区一区| 欧美三区在线视频| 在线一区二区三区四区| 99国产一区| 欧美国产日韩一区| 亚洲人成网站精品片在线观看| 一本一道久久综合狠狠老精东影业| 欧美日韩国产在线播放网站| 欧美成人综合| 亚洲日本va午夜在线电影| 亚洲另类黄色| 激情久久婷婷| 一区二区三区国产在线观看| 国产亚洲成av人在线观看导航| 99国产精品私拍| 国内一区二区在线视频观看| 久久综合给合| 国内精品一区二区三区| 亚洲三级国产| 亚洲先锋成人| 狠狠色狠狠色综合| 欧美一区2区三区4区公司二百| 一区二区久久久久| 亚洲免费小视频| 欧美**字幕| 亚洲国产天堂久久综合网| 国产精品男女猛烈高潮激情| 葵司免费一区二区三区四区五区| 欧美精品久久天天躁| 免费久久精品视频| 国产在线国偷精品产拍免费yy| 久久精品人人做人人爽| 欧美激情精品久久久| 尤物视频一区二区| 亚洲欧美日韩精品久久久久| 亚洲二区免费| 亚洲精品九九| 国产手机视频精品| 看片网站欧美日韩| 欧美在线一二三四区| 国产精品一区二区视频| 久久久精品日韩| 亚洲国产另类久久精品| 久久久久久久性| 国外视频精品毛片| 欧美精品一卡二卡| 欧美成人中文字幕在线| 欧美大胆成人| 老司机精品视频网站| 亚洲视频一区在线观看| 亚洲乱码国产乱码精品精98午夜| 欧美一区二区高清| 久久久久久一区二区三区| 亚洲精品一区二区在线| 老司机精品福利视频| 久久久噜噜噜久久中文字免| 欧美黄污视频| 久久久久综合网| 国产女人水真多18毛片18精品视频| 亚洲欧美日韩视频二区| 亚洲国产精品嫩草影院| 亚洲免费在线| 欧美激情一区在线观看| 亚洲第一色在线| 久久aⅴ国产欧美74aaa| 中文av字幕一区| 欧美高清视频一区二区三区在线观看 | 亚洲午夜高清视频| 亚洲国产日韩在线一区模特| 欧美一区二区三区电影在线观看| 欧美日在线观看| 夜夜嗨一区二区| 亚洲精品视频免费观看| 欧美激情aⅴ一区二区三区 | 亚洲一区二区影院| 亚洲人成人一区二区三区| 久久久夜夜夜| 亚洲二区在线| 牛人盗摄一区二区三区视频| 久久精品欧美| 狠狠综合久久av一区二区小说| 久久都是精品| 久久国产加勒比精品无码| 韩国av一区二区三区| 久久久久国色av免费看影院| 久久成人18免费观看| 红桃视频成人| 欧美国产精品va在线观看| 欧美成年人在线观看| 一区二区三区四区五区在线| 一本色道久久加勒比精品| 国产精品久久久亚洲一区| 久久国产精品一区二区三区四区| 午夜一区二区三视频在线观看 | 亚洲精品乱码久久久久久日本蜜臀 | 亚洲欧美日本在线| 在线观看亚洲一区| 亚洲国产精品视频一区| 欧美日韩一区二区三区在线看| 亚洲免费一在线| 久久婷婷亚洲| 免费亚洲电影在线| 欧美亚洲专区| 亚洲三级影片| 亚洲摸下面视频| 影音先锋中文字幕一区二区| 亚洲成色777777在线观看影院| 欧美日本中文| 久久久久久综合网天天| 乱中年女人伦av一区二区| 一区二区欧美亚洲| 欧美一区二区在线看| 亚洲国产精品999| 亚洲视频在线观看| 亚洲人成欧美中文字幕| 亚洲午夜久久久久久久久电影网| 国语自产偷拍精品视频偷 | 午夜久久tv| 亚洲精品久久7777| 亚洲尤物在线| 夜夜嗨av一区二区三区网页| 午夜激情综合网| 一区二区三区黄色| 久久综合久久综合久久| 亚洲欧洲99久久| 欧美日产国产成人免费图片| 久久综合一区二区三区| 国产精品久久久久国产a级| 欧美国产乱视频| 国产日韩欧美高清免费| 99精品国产在热久久下载| 在线成人小视频| 欧美夜福利tv在线| 亚洲少妇自拍| 欧美日韩国产成人在线| 美女主播精品视频一二三四| 国产精品青草久久久久福利99| 亚洲人www| 亚洲国产mv| 久久成人免费视频| 欧美诱惑福利视频| 国产精品国产三级国产| 99国产精品久久久| 在线视频日本亚洲性| 欧美成人午夜影院|