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

執行時間過長 所造成 疑似記憶體出錯的 程式當機

答題得分者是:暗黑破壞神
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-21 22:50:33 IP:140.114.xxx.xxx 訂閱
事件 : 

//---------------------------------------------------------------------------------------
程式執行 大約7-8個小時 會當機 (實行長時間的運算)
執行 training 等 動作重複性的很高 耗時的運算

目前確認 迴圈 至少有成功跑完 20多次
初步判斷 不是程式思路錯誤

記憶體使用方法:

全域變數 : 除了 利用 AnsiString 來方便指令 存寫的位置
其餘都是利用point 在函式間傳輸


其餘變數宣告 類似以下
void function( float **Data )
{
float **OutputData;
OutputData = new float*[d_PictureW];
for (int w = 0; w < d_PictureW ; w )
OutputData[w] = new float[d_PictureH];
//
// OOXX的一連串動作 0.0a"
//
for (int y = 0; y < d_PictureW; y )
delete[] OutputData[y];
delete[] OutputData;
}

所以 我是有利用 delete 去放掉point 指到的位置空間

由於習慣性這麼作 理論上 程式使用的記憶體 因該會 重置
(這裡不確定 這種做法 重置記憶體 夠不夠確實)


至於 float **OutputData; 本身 或是 函式內宣告的矩陣(如 int array[5][5];)
這類變數 因該在該函式 return 時 被消滅到(釋放記憶體)


但是每次當機的時候 藍底的位置都停在類似
OutputData = new float*[d_PictureW];
for (int w = 0; w < d_PictureW ; w )
<---這類位置 (所以我猜測是記憶體用盡)
//---------------------------------------------------------------------------------------

請問
1. 我的做法有哪裡不妥當嗎? 是否有哪裡是一般人會忽視到 的地方 造成記憶體用盡?

2. 是否有更好的記憶體管理方式? 或是指令.
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-23 19:36:56 IP:61.64.xxx.xxx 訂閱

檢查

1. stack overflow
2. access 已經釋放的記憶體位址
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-25 08:54:46 IP:123.194.xxx.xxx 訂閱
我前一陣子 突然想到一個可能性
想請大家確認一下

因為我執行程式 是直接在BCB打開 用RUN 來跑 好幾個小時

不是 編譯後 執行EXE

請問 直接BCB打開用RUN執行程式 是不是會有額外佔用記憶體?
(突然發現 我這還真是壞習慣= =")

在想是不是因為這個原因 所以才會當機
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-03-25 12:05:37 IP:220.131.xxx.xxx 訂閱
原因不會在你說的那邊。
如果你懷疑記憶體被你用完了。
你應該可以查得到 new 的情況。如果記憶體不夠會發生什麼事。
去搞個 try catch 這種東西來記錄是否有產生這個問題。

===================引 用 文 章===================
因為我執行程式 是直接在BCB打開 用RUN 來跑 好幾個小時

不是 編譯後 執行EXE

rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-03-26 09:07:58 IP:140.114.xxx.xxx 訂閱
由於之前沒處理過  關於紀錄記憶體使用的經驗
所以不太清楚你的意思

關於記憶體 的了解
我只知道 宣告太大 (不使用point) 會當機
全域變數宣告太大 compiler 過不了
如果方便 可以簡略說明一下做法嗎? (這方面我是完全無頭緒...)


此外我再補充一些狀況
1. 朋友和我說 可以打開工作管理員 去看處理程序 的 尖峰記憶體使用量 是否有持續增加的趨勢
但我觀察下 (當機後打開工作管理員來看) 是沒有發生這件事情 (和跑1小時所紀錄的用量相同)
我想問一下 此觀察 是否可以證明記憶體 有無 持續礦大? (算是額外學習的確認)

2. 上週5 放著程式 跑了2天 今天回來看 結果沒當機
和當機的程式 分屬於不同 CPP檔 (同一個project 不同training code)

一樣是training 一樣多的資料 這次一次跑完(沒當機)
之前要分3次跑... (當機2次)

所以.... 這我也不知道該說啥 程式都是我寫的 兩邊記憶體宣告方式又一樣....
可能只能用你說的方法觀察....
(這狀況只是我想表達 也是有沒當機的機會....)


===================引 用 文 章===================
原因不會在你說的那邊。
如果你懷疑記憶體被你用完了。
你應該可以查得到? new 的情況。如果記憶體不夠會發生什麼事。
去搞個 try catch 這種東西來記錄是否有產生這個問題。

------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-03-26 11:12:11 IP:220.131.xxx.xxx 訂閱
有時候有些意外的”靈異”現象。
有可能你的 C Builder 沒有 patch 過。而你又用到它的陷阱。
也有可能你的RAM有問題。也有可能你選了最佳化。而出了什麼問題。
會導致相同的程式碼,copy 到另一段而改了個函數名。就出事。
而最好的方法。就是像我說的。加一些 try catch 去看看你的記憶體配置有沒有問題。
良好的寫程式習慣是要把那些個東西都加一加的。

全域變數宣告太大是因為它在宣告時用的記憶體屬於 stack 的。而你的 compiler 沒有去宣告你的 stack 要加大。
所以在編譯時就會出現問題。
這個在你的 c builder 的設定中有。自己找一下。別問我去那邊找。

而動態配置上面比較沒有這個問題只是你要去判斷是否有配到記憶體。

至於說用工作管理員去看它。也對啦。不過它的反應速度不夠快。這個你可以查別的資料。不要問我為什麼。
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-03-26 17:37:08 IP:140.114.xxx.xxx 訂閱
恩 那問題就暫時到此  等我找書了解 try catch 是什麼 外加測試後
有問題在發問

===================引 用 文 章===================
有時候有些意外的”靈異”現象。
有可能你的 C Builder 沒有 patch 過。而你又用到它的陷阱。
也有可能你的RAM有問題。也有可能你選了最佳化。而出了什麼問題。
會導致相同的程式碼,copy 到另一段而改了個函數名。就出事。
而最好的方法。就是像我說的。加一些 try catch 去看看你的記憶體配置有沒有問題。
良好的寫程式習慣是要把那些個東西都加一加的。

全域變數宣告太大是因為它在宣告時用的記憶體屬於 stack 的。而你的 compiler 沒有去宣告你的 stack 要加大。
所以在編譯時就會出現問題。
這個在你的 c builder 的設定中有。自己找一下。別問我去那邊找。

而動態配置上面比較沒有這個問題只是你要去判斷是否有配到記憶體。

至於說用工作管理員去看它。也對啦。不過它的反應速度不夠快。這個你可以查別的資料。不要問我為什麼。
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

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