• <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>

            road420

            導(dǎo)航

            <2006年10月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統(tǒng)計(jì)

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            對(duì)象的動(dòng)態(tài)分配

            1 、對(duì)象的分類

            ??????? 全局對(duì)象( Global Object )?????????????????????Controlled by System

            ??????? 局部對(duì)象( Local Object )????????????????????? Controlled by System

            ??????? 動(dòng)態(tài)生成對(duì)象( Dynamically Allocated Object ?? ?? ? ??controlled by programmer

            ?

            2 、動(dòng)態(tài)對(duì)象的生與死

            ??????? 創(chuàng)建: new

            ??????? 銷毀: delete

            ?

            3 、動(dòng)態(tài)對(duì)象的創(chuàng)建的地址

            ???????? 內(nèi)存池( memory pool )中的一塊程序自由存儲(chǔ)區(qū)域( free store area ),實(shí)際上就是通常所說的堆( Heap

            ?

            4 、動(dòng)態(tài)對(duì)象的存在形式

            ??????? 簡(jiǎn)單對(duì)象( single object

            ??????? 對(duì)象數(shù)組( array object

            ??????? The placement new express

            ?

            5 、動(dòng)態(tài)對(duì)象的使用

            ??????? 動(dòng)態(tài)對(duì)象的操縱

            動(dòng)態(tài)對(duì)象沒有名稱,而是返回分配對(duì)象的指針地址,所有操作都是通過指針間接完成

            ??????? 動(dòng)態(tài)對(duì)象的初始化

            動(dòng)態(tài)對(duì)象分配的內(nèi)存區(qū)域是沒有初始化過的,里面存在的是隨機(jī)數(shù)據(jù)

            ?

            6 、動(dòng)態(tài)對(duì)象及指針的生命周期

            ??????? 動(dòng)態(tài)對(duì)象

            持續(xù)時(shí)間為 new ? è delete

            ??????? 指針

            根據(jù)其自身類型決定(全局 / 局部)

            ?

            7 delete 的使用

            1

            ???????? int ?*pi=new int;

            ???????? if(pi!=0){

            ???????? ? delete pi;

            }??????

            該段程序運(yùn)行起來是沒有問題的,但是卻存在畫蛇添足的一筆: if(pi!=0)

            ???????? 原因是, delete 會(huì)自動(dòng)完成這個(gè)測(cè)試,如果顯式地測(cè)試,將會(huì)多執(zhí)行一次測(cè)試。所以說完全沒有必要。

            ????????

            ???????? 2

            ?????????????????? pointer=0;??????????????????? // 不指向任何對(duì)象

            ?????????????????? delete pointer;????????????? // 沒有必要

            ????????

            ???????? 總結(jié):

            也許會(huì)有人覺得兩個(gè)例子似乎有點(diǎn)矛盾,其實(shí)上述例程的意思是:

            ??????? 當(dāng)我們不知道一個(gè)對(duì)象內(nèi)存是否已經(jīng)釋放的時(shí)候,直接 delete 即可,是沒有任何問題的;額外的判斷完全沒有必要,反而會(huì)增加系統(tǒng)的工作量。

            ??????? 當(dāng)我們明確地知道對(duì)象指針 ==NULL 時(shí),表明已經(jīng)釋了對(duì)象。這時(shí)就可以少寫一行代碼了。當(dāng)然如果有人想看看計(jì)算機(jī)又沒有不良反應(yīng),另當(dāng)別論。

            同時(shí)也證明了①,刪除一個(gè) NULL 對(duì)象是沒有任何問題的

            ?

            8 、動(dòng)態(tài)內(nèi)存分配常見錯(cuò)誤

            ??????? 內(nèi)存泄露

            我想這個(gè)問題對(duì) C++ 程序員來說,是非常熟悉的。

            u??????? 根源是:?

            簡(jiǎn)短的回答: new delete 沒有配對(duì)使用

            明白了嗎?還不明白? next

            ???????? ???????? 只給對(duì)象分配了內(nèi)存,但是直到關(guān)閉程序的時(shí)候,都還沒有向?qū)ο笠啬菈K內(nèi)存。

            u??????? 怎樣發(fā)現(xiàn)?

            ????????? Vc IDE 中, debug 狀態(tài),程序結(jié)束時(shí) output 窗口的 Detect Memory leak

            ????????? 使用工具軟件,如: BoundCheck

            ?

            u??????? 如何避免?

            呵呵,知道了根源就應(yīng)該知道該咋辦了。。。

            ????????

            ??????? / 寫已經(jīng)刪除的對(duì)象(內(nèi)存)

            當(dāng)對(duì)象 delete 以后,對(duì)象內(nèi)存被系統(tǒng)回收,其指針就指向到一塊非法的內(nèi)存。如果再對(duì)該對(duì)象指向內(nèi)存操作就會(huì)導(dǎo)致不可預(yù)知的錯(cuò)誤。因此,通常的做法是 delete 之后,立即賦 NULL

            ?

            ??????? 內(nèi)存 corruptted

            很熟悉,是吧?不要著急,請(qǐng)聽我慢慢道來。。。

            ???????? 未命名.bmp

            根源:

            u??????? ptrA ptrB 都指向同一塊內(nèi)存

            u??????? 通過 ptrA 釋放內(nèi)存 Mem0 Mem0 分配給其它對(duì)象 ptrC

            u??????? ptrB 釋放內(nèi)存 , Mem0 存儲(chǔ)的 ptrC 指向的新對(duì)象就被破壞掉了。

            u??????? 再次對(duì) ptrC 操作就會(huì)出錯(cuò)

            ?

            ??????? 對(duì)象類型錯(cuò)誤

            例:

            CDialog ?dlg=new CDialog

            delete dlg

            ???????? ???????? 你能發(fā)現(xiàn)什么不對(duì)嗎?

            ?????????????????? 提示一下, debug 運(yùn)行會(huì)發(fā)現(xiàn) mem leak

            ?????????????????? 知道了吧, what

            ???????? ???????? 就是 delete dlg ??????????????????

            5.1 中說過, new 返回的是指針。所以應(yīng)該將 dlg 聲明為 CDialog* 類型。

            posted on 2006-10-23 19:54 深邃者 閱讀(372) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产精品久久国产精品99盘| 久久精品成人国产午夜| 日韩精品久久久久久久电影| 一本色道久久88综合日韩精品 | 99久久无色码中文字幕人妻| 亚洲午夜无码久久久久| 久久综合丁香激情久久| 久久免费99精品国产自在现线 | 热99re久久国超精品首页| 日本加勒比久久精品| 国产精品99久久99久久久| 人妻无码久久精品| 久久精品国产精品亚洲精品| 国产精品美女久久福利网站| 色综合久久久久| 国内精品九九久久久精品| 人妻无码αv中文字幕久久琪琪布| 国产精品久久久久aaaa| 少妇人妻综合久久中文字幕| 国产精品欧美久久久久天天影视 | 国产精品亚洲综合久久| 久久久久久久综合综合狠狠| 国产成人精品久久免费动漫| 午夜精品久久久久久久| 色狠狠久久综合网| 热久久视久久精品18| 午夜精品久久影院蜜桃| 久久精品国产国产精品四凭 | 欧美日韩精品久久久久| 国产69精品久久久久99| 日韩一区二区久久久久久| 99久久99久久精品免费看蜜桃| 99久久国产综合精品女同图片 | 久久亚洲sm情趣捆绑调教| 热久久国产欧美一区二区精品 | 偷偷做久久久久网站| 亚洲午夜福利精品久久| 人妻无码αv中文字幕久久琪琪布| 色99久久久久高潮综合影院| 一本色道久久88综合日韩精品| 国内精品久久国产|