全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5687
推到 Plurk!
推到 Facebook!

關於BCB的記憶體空間釋放

答題得分者是:aftcast
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-11-08 15:51:43 IP:140.127.xxx.xxx 訂閱
各位大大:

我想請教一些基本的記憶體使用上的問題

我剛剛測試了一下

假設在Button 內寫了這樣的程式

double *text;

text = new double[1000];

delete text;

上述的這一段程式在執行的時候我開啟工作管理員看記憶體的使用情況是很正常的
的確是有把記憶體釋放出來

但是 假設我是宣告成靜態記憶體 點擊Button之後卻發現記憶體沒有被釋放出來

這是為什麼呢 我的問題如下
點擊Button視為一個事件 一個事件結束之後 所宣告的記憶體空間不是也一並結束嗎


那我上網找了一下 用這種方法釋放記憶體

int a;

a=NULL;

這種方法比 單純 只有宣告 而沒有 接地 的情形釋放掉一些些記憶體 但是不完全

不能像動態宣告那樣完全的釋放

有沒有什麼語法可以在BCB事件執行運算後完全釋放掉靜態的記憶體

麻煩各位了~!!
------
恩...
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-11-08 22:24:28 IP:61.219.xxx.xxx 訂閱
>>>有沒有什麼語法可以在BCB事件執行運算後完全釋放掉靜態的記憶體

沒有!! 我想你對於變數的「生命期」與「範圍/視野」這二個議題並不了解,請google一下這方面的資料。

你說的靜態,應該是指 static 這個修飾詞下的變數吧? 這個下的變數生命是從程式一開始就配置好,只是若它出現在函式中,則其視野限於該函式,對於函式外若使用這個變數名則不是指同一個。此外,若宣告在函式外的static,那表外部靜態變數,生命也是開始至程式結束,只是它的視野是限制在「該檔案裡」,別的檔要引用是不行的。

所以……既然你要使用靜態的變數,就表示你要準備讓它活到程式結束,否則…就動態的new與delete!

靜態若也能delete,那動態要幹嘛? 是吧??! 不清楚你為何"執意"想要讓靜態的被釋放? 只是想了解或是遇到什麼樣的情形? 不過不管什麼情形,都可以解決。


註: 關於你說的
int a;
a=NULL;
可以釋放的情形,其實是你誤會了! 因為 int a 叫auto等級/或稱局部的變數,它的生命是從函式進入開始,至函式結束。至於 a=NULL,並沒有釋放什麼,只是為了避開"野指標"的問題。這些議題都是屬於上面我提的。若你對變數的生命與視野了都了解後,你自然就會理解!

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2009-11-08 22:27:48, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-11-09 09:52:54 IP:140.127.xxx.xxx 訂閱
aftcast 您好:

聽了您的意見真是受教了

我指的靜態的意思是指配置一個固定的記憶體位置

因為我的全域變數已經宣告一堆了

那我想在Button裡面 如果用到的一些int 或 double 的參數

我儘可能的只宣告在Button裡面就好 那現在問題是我可能會執行很多次Button

沒關係我先上網找看看


===================引 用 aftcast 文 章===================
>>>有沒有什麼語法可以在BCB事件執行運算後完全釋放掉靜態的記憶體

沒有!! 我想你對於變數的「生命期」與「範圍/視野」這二個議題並不了解,請google一下這方面的資料。

你說的靜態,應該是指 static 這個修飾詞下的變數吧? 這個下的變數生命是從程式一開始就配置好,只是若它出現在函式中,則其視野限於該函式,對於函式外若使用這個變數名則不是指同一個。此外,若宣告在函式外的static,那表外部靜態變數,生命也是開始至程式結束,只是它的視野是限制在「該檔案裡」,別的檔要引用是不行的。

所以……既然你要使用靜態的變數,就表示你要準備讓它活到程式結束,否則…就動態的new與delete!

靜態若也能delete,那動態要幹嘛? 是吧??! 不清楚你為何"執意"想要讓靜態的被釋放? 只是想了解或是遇到什麼樣的情形? 不過不管什麼情形,都可以解決。


註: 關於你說的
int a;
a=NULL;
可以釋放的情形,其實是你誤會了! 因為 int a 叫auto等級/或稱局部的變數,它的生命是從函式進入開始,至函式結束。至於 a=NULL,並沒有釋放什麼,只是為了避開"野指標"的問題。這些議題都是屬於上面我提的。若你對變數的生命與視野了都了解後,你自然就會理解!

------
恩...
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-11-09 10:21:02 IP:210.64.xxx.xxx 訂閱
你好,

你說 「那現在問題是我可能會執行很多次Button」

我了解了,若每次離開button後,裡面的變數無需被保留,那就用一般的auto 變數 (這詞是專有的,不過,我們早就經常在使用)。如:

foo( )
{
double d; // auto 變數
double pd[1000]; //這裡最好不要這樣,因為…auto變數使用的是stack的記憶體,其大小有限制,容易overflow。
....
....
} // 當程式離開這裡的時候 d 與pd的記憶體就自動會被釋放,應該是符合你要的。
若 pd陣列裡的數量非常大,請改用 new 與delete,避免overflow…

bar()
{
static double d; // 靜態的 auto 變數
.........
} // 離開這裡後,d還活著,換句話說裡面的值還保留著不被破壞

ShowMessage(d); //這行會錯,因為bar裡的d雖然活著,但它的視野不到這裡,compiler會無視bar裡的變數


------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-11-09 11:02:13 IP:140.127.xxx.xxx 訂閱
感謝
------
恩...
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-11-10 10:09:45 IP:140.127.xxx.xxx 訂閱
不好意思再請問一下

下列這段程式碼為什麼 當事件結束後一樣會把記憶體 hold 住 沒有釋放阿.....

實在是把我弄傻了....=..=

雖然w 和 h我是宣告成全域變數 但是早在執行這個事件之前就已經有使用過w 和 h了

真是怪了

我只有做簡單的兩步驟而已 開圖 執行此事件

開圖完之後記憶體 15424K 執行完此事件 變成 18076K 再執行一次此事件變成 20708K .....


[code cpp]
double ra,rb,rc,rd,re,rf,rg,rh,ri,rj,rk,rl,rx,ry,rz;


double *NCR,*NCG,*NCB;

NCR = new double[w*h];
NCG = new double[w*h];
NCB = new double[w*h];

for(i=0;i {
NCR[i]=NCG[i]=NCB[i]=0;
}

for(j=0;j {
for(i=0;i {
color=Form1->Image2->Picture->Bitmap->Canvas->Pixels[i][j];
NCR[i w*j] = GetRValue(color);
NCG[i w*j] = GetGValue(color);
NCB[i w*j] = GetBValue(color);
}
}


for(j=0;j {
for(i=0;i {
fleg=0;
for(l=j-2;l<=j 2;l )
{
for(k=i-2;k<=i 2;k )
{

if( (k>=0)&&(k=0)&&(l {

if(NCR[k w*l]!=255)
{

fleg ;
}

}

}
}

}
}














for(j=0;j {
for(i=0;i {
Form1->Image2->Canvas->Pixels[i][j]=TColor(RGB(NCR[i w*j],NCG[i w*j],NCB[i w*j]));
}
}


delete [] NCR,NCG,NCB;

[/code]






===================引 用 aftcast 文 章===================
你好,

你說 「那現在問題是我可能會執行很多次Button」

我了解了,若每次離開button後,裡面的變數無需被保留,那就用一般的auto 變數 (這詞是專有的,不過,我們早就經常在使用)。如:

foo( )
{
double d; // auto 變數
double pd[1000]; //這裡最好不要這樣,因為…auto變數使用的是stack的記憶體,其大小有限制,容易overflow。
....
....
} // 當程式離開這裡的時候 d 與pd的記憶體就自動會被釋放,應該是符合你要的。
若 pd陣列裡的數量非常大,請改用 new 與delete,避免overflow…

bar()
{
static double d; // 靜態的 auto 變數
.........
} // 離開這裡後,d還活著,換句話說裡面的值還保留著不被破壞

ShowMessage(d); //這行會錯,因為bar裡的d雖然活著,但它的視野不到這裡,compiler會無視bar裡的變數


------
恩...
編輯記錄
istillloving 重新編輯於 2009-11-10 10:10:49, 註解 無‧
istillloving 重新編輯於 2009-11-10 10:11:45, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-11-10 22:26:24 IP:61.219.xxx.xxx 訂閱
請把delete改成

delete [] NCR;
delete [] NCG;
delete [] NCB;

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2009-11-10 23:14:47, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-11-10 23:29:55 IP:122.123.xxx.xxx 訂閱
又麻煩您了

但是我試了一下好像也一樣沒變呢

我如果開個連續影像 我看是掛定了....=..=

而且我發現只要把Form縮小到工具列再放大 記憶體可以釋放很多呢....

真是難以理解...=..=




===================引 用 aftcast 文 章===================
請把delete改成

delete [] NCR;
delete [] NCG;
delete [] NCB;

------
恩...
編輯記錄
istillloving 重新編輯於 2009-11-10 23:32:04, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-11-10 23:45:44 IP:61.219.xxx.xxx 訂閱
不知是否還有其他的地方有delete不完整?
因為我把你的程式delete的部份有做實際的測式。若是一行,是一定會一直增上去。若改成三行,則無論按幾次,記憶體都是保持固定。

覺得該詳查所有NEW的資源與GLOBAL的部份…其實真的想不出什麼好辦法。

註: 也許有一個,就是使用Code Guard的功能,但少人用,解釋起來…有一點點的時間。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
flowerking
一般會員


發表:0
回覆:2
積分:0
註冊:2010-01-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-02-11 14:23:08 IP:220.128.xxx.xxx 訂閱
應該是..

double *text;

text = new double[1000];

delete [] text;

系統時間:2024-11-25 13:00:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!