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

            一秋草木

            Nothing Is Impossiable!
            posts - 11, comments - 10, trackbacks - 0, articles - 2
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            1 、對象的分類

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

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

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

            ?

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

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

            ??????? 銷毀: delete

            ?

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

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

            ?

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

            ??????? 簡單對象( single object

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

            ??????? The placement new express

            ?

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

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

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

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

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

            ?

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

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

            持續(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è)測試,如果顯式地測試,將會(huì)多執(zhí)行一次測試。所以說完全沒有必要。

            ????????

            ???????? 2

            ?????????????????? pointer=0;??????????????????? // 不指向任何對象

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

            ????????

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

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

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

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

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

            ?

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

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

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

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

            簡短的回答: new delete 沒有配對使用

            明白了嗎?還不明白? next

            ???????? ???????? 只給對象分配了內(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)刪除的對象(內(nèi)存)

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

            ?

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

            很熟悉,是吧?不要著急,請聽我慢慢道來。。。

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

            根源:

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

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

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

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

            ?

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

            例:

            CDialog ?dlg=new CDialog

            delete dlg

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

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

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

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

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

            ?

            這個(gè)主題的內(nèi)容就講完了,還有一些相關(guān)內(nèi)容在接下來的文章中見:

            u??????? The placement new express

            u??????? 內(nèi)存沖突

            u??????? 內(nèi)存 corruptted 解決辦法

            Feedback

            # re: 對象的動(dòng)態(tài)分配(Dynamically Allocated Object)  回復(fù)  更多評論   

            2006-08-06 09:46 by thanksgiving
            最近我遇到了一個(gè)BUG,一直找不出原因,看到你這篇文章,我想問問你是否遇到過類似的問題.
            我前幾天買了臺(tái)新電腦,P4 64bit的CPU,我的舊電腦是AMD 64bit的,都是32位的XP系統(tǒng),我的程序在我的舊電腦上運(yùn)行了了20多天(15-30個(gè)進(jìn)程,每天運(yùn)行20個(gè)小時(shí)),從來沒有發(fā)生過內(nèi)存異常.但我的程序在新電腦上頻繁發(fā)生異常,運(yùn)行3個(gè)進(jìn)程平均二小時(shí)就會(huì)發(fā)生一次,經(jīng)過調(diào)試發(fā)現(xiàn)異常總是出現(xiàn)在內(nèi)存分配和釋放里:
            1:局部string對象的自動(dòng)釋放出錯(cuò)(STL的string);
            2;new出錯(cuò),而且new的字節(jié)也很小,才200字節(jié)左右;
            3:delete出錯(cuò),被刪除的內(nèi)存塊調(diào)試發(fā)現(xiàn)也是正常的,并不是無效內(nèi)存塊;

            開始我以為是因?yàn)槎鄠€(gè)線程同時(shí)申請堆內(nèi)存,導(dǎo)致出現(xiàn)爭奪的情況,于是我給每一個(gè)new和string構(gòu)造的地方都加了EnterCriticalSection(&cs);LeaveCriticalSection(&cs);,結(jié)果還是頻繁出現(xiàn)異常.

            這BUG真的很古怪,而且我在我同學(xué)的電腦上運(yùn)行了4天(60個(gè)進(jìn)程,20小時(shí)每天),一個(gè)異常都沒出現(xiàn)

            # re: 對象的動(dòng)態(tài)分配(Dynamically Allocated Object)  回復(fù)  更多評論   

            2006-08-06 14:00 by 一秋草木
            @thanksgiving
            1、出錯(cuò)的提示是什么?能否更進(jìn)一步描述一下?
            2、建議使用boundcheck,或在debug狀態(tài)看看,確認(rèn)出問題的地方的對象是否在其它的地方有關(guān)聯(lián)。這是最原始的辦法了。
            3、另外內(nèi)存塊有數(shù)據(jù)不一定是正常的,有可能分配給了其它對象;

            # re: 對象的動(dòng)態(tài)分配(Dynamically Allocated Object)  回復(fù)  更多評論   

            2006-08-08 16:25 by thanksgiving
            都是
            0x7c931ec3 處未處理的異常: 0xC0000005: 寫入位置 0x018990ba 時(shí)發(fā)生訪問沖突 。
            0x7c931f52 處未處理的異常: 0xC0000005: 讀取位置 0x000c01e3 時(shí)發(fā)生訪問沖突 .這樣的異常
            觀察調(diào)用堆棧發(fā)現(xiàn)問題都在new和delete函數(shù)里,發(fā)生的錯(cuò)誤都在ntdll.dll

            還有就是錯(cuò)誤報(bào)告也很有意思,明明是intel的CPU,可它的提示是
            錯(cuò)誤報(bào)告:CPU AMD Feature Code: 00C3E824......
            我的代碼應(yīng)該沒問題,要不然怎么在我的舊電腦和我同學(xué)的電腦上沒發(fā)生過內(nèi)存異常

            # re: 對象的動(dòng)態(tài)分配(Dynamically Allocated Object)  回復(fù)  更多評論   

            2006-08-10 16:44 by 一秋草木
            呵呵,這種情況我也不確定了。
            建議你到微軟的知識(shí)庫上去看看。里面有很多異常的介紹。
            国产成人精品白浆久久69| 亚洲天堂久久精品| 亚洲欧美一级久久精品| 国产精品一区二区久久精品涩爱| 国产毛片欧美毛片久久久 | 国产精品久久久久一区二区三区| 精品久久久久久国产| 久久亚洲精品无码观看不卡| 免费无码国产欧美久久18| 久久精品无码专区免费东京热| 国产三级观看久久| 久久99精品久久只有精品| 久久人人爽人人爽人人片AV东京热 | 成人国内精品久久久久一区| 精品无码人妻久久久久久| 国内精品久久久久久久久电影网| 99久久免费国产精品| 亚洲精品乱码久久久久久中文字幕 | 久久电影网2021| 无码人妻精品一区二区三区久久久 | 久久久久久久久久久久中文字幕 | 国产精品99久久久久久www| 亚洲精品乱码久久久久久蜜桃图片 | 99久久精品免费国产大片| 伊人色综合久久天天人手人婷| 久久91精品综合国产首页| 青青草国产成人久久91网| 久久精品中文騷妇女内射| 久久精品国产亚洲AV影院| 国产精品中文久久久久久久| 久久av高潮av无码av喷吹| 99久久国产综合精品成人影院| 99re这里只有精品热久久| 久久丫精品国产亚洲av不卡| 77777亚洲午夜久久多人| 伊色综合久久之综合久久| 亚洲国产香蕉人人爽成AV片久久| 久久免费国产精品| 欧美精品乱码99久久蜜桃| 久久久久国产精品嫩草影院| 亚洲av伊人久久综合密臀性色|