線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:906
推到 Plurk!
推到 Facebook!

為什麼記憶體會被灌爆!!

尚未結案
miloshop
一般會員


發表:8
回覆:22
積分:6
註冊:2004-10-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-12 14:35:10 IP:219.70.xxx.xxx 未訂閱
您好: 我想請教一下,假設我有一程式固定1000毫秒重VFW裡抓取影像。並且把影像ASSIGN到一個CLASS裡.在這個一秒的動作裡頭,我都用NEW產生一個CLASS,並且用DELETE在刪除記憶體.不過會有一個奇怪的現象,就是記憶體的耗用會一直狂昇!!後來改用AUTO_PTR去試,在RELEASE時也會有問题!!最後試著把NEW放在FORM的CONSTRUCT裡頭,並且把DELETE拿掉,用一個CLASS去處理這個FRAME.不過卻在副程式回去主程式時出現AV~~不知道大大們有沒有遇過這種問題.還是說在每一秒抓取的FRAME不能用NEW產生並用DELETE刪除??DELETE不是會把配置的記憶體刪掉嗎??為什麼還是會有記憶體爆增的現象呢...
miloshop
一般會員


發表:8
回覆:22
積分:6
註冊:2004-10-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-12 14:51:53 IP:219.70.xxx.xxx 未訂閱
class TFacePic {   private:     short int ValleyMat[644][484];     short* pTmpMat;     short* pValleyMat; //---------------------------------------------------------------------------     int PicVertPrj[644];     int PicHorzPrj[484];     int PicGradient[644]; //---------------------------------------------------------------------------        short int ChL[644][484],ChR[644][484],ChT[644][484],ChB[644][484];     char _bChL[644][484],_bChR[644][484],_bChT[644][484],_bChB[644][484]; //---------------------------------------------------------------------------     int *pVertPrj,*pHorzPrj,*pGradient; //---------------------------------------------------------------------------     vector Boundary; BFEllipse _BFE; //--------------------------------------------------------------------------- Graphics::TBitmap *TmpBmp; //--------------------------------------------------------------------------- bool TFacePic::PicExist(void); //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- }; 我的CLASS大致上如上,我還想請教一下,如果我CLASS內有配置大量的陣列~那我需要在解構子把這些陣列刪除嗎??或是說還有什麼可能會使得這些東西停留在我的記憶體裡頭~~謝謝大大
yhchu
一般會員


發表:2
回覆:70
積分:24
註冊:2004-01-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-12 15:33:35 IP:220.130.xxx.xxx 未訂閱
你在 class 內自行由 heap 配置的記憶體要自行釋放,確定有做嗎?
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-12 15:49:41 IP:61.228.xxx.xxx 未訂閱
miloshop, 看了你類別裡所宣告的陣列,還真的是滿佔記憶體的,你的問題應該是發生在應用程式中,可能要看看你是如何去NEW一個新物件跟如何DELETE掉你先前產生的物件,另外假設你沒有要比較或紀錄先前的畫面的話,你應該不需要用到NEW的方式去產生物件,你可以直接宣告為靜態物件,把每一秒的畫面ASSIGN給他就可以了. 第2個問題是要看你類別裡是否有用NEW的方式產生物件,如果有的話你就需要在解構子中刪除掉你NEW出來的東西,反之則不用.
miloshop
一般會員


發表:8
回覆:22
積分:6
註冊:2004-10-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-12 17:43:28 IP:219.70.xxx.xxx 未訂閱
謝謝大大的指教: 因為第一次寫OOP就把他寫的很大,本來想說應該是OK,但是當我後來在自動擷取時才發現,程式剛開始跑都很正常,但記憶體會狂增!!剛才我已經抓了一隻蟲,我想再請教大大一下, 1.如果我用vector Boundary而不是用vector *Boundary那我應該不需要使用NEW運算子嘛..是否正確呢?? 2.我NEW跟DELETE之間的相對應我有做的很確實,不過如果我去ASSIGN時,會出現AV(access violation)的問題,不知道是我那裡ASSIGN錯誤,還在重看中!! 先謝謝兩位大大的指教,祝 順心!!
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-13 09:29:12 IP:61.228.xxx.xxx 未訂閱
miloshop, 1.正確,如果你用指標的話就必須分配一個有效的指標給他. 如下 vector Boundary; vector *BoundaryPtr; BoundaryPtr=new vector; 或是 BoundaryPtr=&Boundary; 2.如果NEW跟DELETE的對應有作好的話,應該是不會有"爆"增的狀況,至於你AV()的問題,沒看到CODE我也不知道如何回答你.
miloshop
一般會員


發表:8
回覆:22
積分:6
註冊:2004-10-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-13 14:58:25 IP:219.70.xxx.xxx 未訂閱
嗯嗯~~已經把BUG都找出來了!!看起來似乎是因為我在函數裡有用到static的關鍵字,然後他就一直爆增一直爆增!!謝謝大大的回覆!!不過不知道大大們在做DEBUG時是不是有什麼技巧,因為有時出現那個CPU視窗,實在都不知道該從那裡看起!!像是access violation的問題有時真的都很無厘頭!!有時明明VFW跑的很正常,記憶體雖不會被灌爆了~~但是突然就出現一個access violation真的是不知道該怎麼去找錯...
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-13 15:29:18 IP:61.228.xxx.xxx 未訂閱
Access violation的問題,大部分都出在程式中設定的指標指向錯誤的位址,或是讀寫陣列跑過頭了,跑到不該去的地方,他就會出現上面的訊息.
系統時間:2024-05-18 20:27:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!