討論區快速選單
知識庫快速選單
政府補助!學嵌入式+物聯網 網路投保旅行平安險 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
靜態陣列是否確實在程式結束後釋放?
更改我的閱讀文章字型大小
作者 : phoebus7(小P) 貼文超過200則人氣指數超過30000點
[ 貼文 407 | 人氣 43340 | 評價 690 | 評價/貼文 1.7 | 送出評價 121 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/7/2 上午 06:21:48
手邊有一個程式是利用C寫的 其中一個動作會將檔案內容讀入陣列中(並未配置動態記憶體),
加以改變(加密)之後再寫入到其他檔案

問題來了,在第一次執行的時候,以600MB左右的檔案加以測試,執行時間約 14 秒
但是第二,三....次執行時,卻只需要3秒左右

因此想說是否可能未釋放完全,於是修改程式為在結束前將陣列內容全部填為單一字元

但是測試的結果仍然和前次一樣 , 只要有執行過之後 , 之後的處理速度都會特別快

另外,有嘗試改寫成配置動態記憶體的形式
加密的過程中釋放A陣列並無發生錯誤,但是在反向操作(解密,僅有內容運算時與加密不同,其餘程式碼[皆相同])
遇到釋放A陣列時便會發生錯誤

//已經確認過並無重複釋放(free),其他陣列在釋放之後也馬上將指標導向null

想請問,靜態陣列不是在程式結束之後就會將記憶體釋放嗎?那為何會產生這種情況呢?

不知道是否有人在只使用動態記憶體(malloc)時遇到這種情況過呢?
作者 : member001(member one)
[ 貼文 178 | 人氣 0 | 評價 1150 | 評價/貼文 6.46 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人phoebus7註記此篇回應為很有道理 2011/7/3 下午 03:38:01
執行完畢,程式都結束了,程式還能控制些甚麽?與C有甚麽關係?

接手的是OS,OS如何處理又怎能一概而論?Mac有一套,Windows有一套,Linux亦有一套,其它的OS亦有它們的一套。

第二次執行時更快是一點都不奇怪的,OS也許會prefetch程式,data亦可能在disk cache內,比首次執行快並不奇怪!

OS釋放程式佔用的內存時一般以LRU mark dirty進行,若未弄花內存拷貝前再要用,先進的OS會直接unmark dirty重用,連prefetch的工作都可省卻。

static data會否unmark dirty?視乎程式是否reentrant,Reentrant的話,static data便不能重用。
作者 : phoebus7(小P) 貼文超過200則人氣指數超過30000點
[ 貼文 407 | 人氣 43340 | 評價 690 | 評價/貼文 1.7 | 送出評價 121 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/7/4 上午 02:13:14
當時陷在記憶體的迷思裡面 , 沒考慮到 prefetch 這部分~~
受教了! 謝謝~
作者 : daniel(冷眼)討論區板主 VC++優秀好手遊戲程式設計優秀好手DirectX優秀好手C++優秀好手貼文超過1000則人氣指數超過70000點
[ 貼文 1564 | 人氣 84169 | 評價 6990 | 評價/貼文 4.47 | 送出評價 15 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/7/4 上午 10:26:16
應該是開機後第一次讀取路徑或檔案時會發生的狀況.
使用FindFirstFile來掃瞄路徑也可以發現這個問題.
當路徑中包含數千個檔案, 明顯第一次跟後續執行時間差距非常大

基本上"檔案管理員"也會發生一樣的狀況
作者 : member001(member one)
[ 貼文 178 | 人氣 0 | 評價 1150 | 評價/貼文 6.46 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/7/5 上午 08:42:46
會否unmark dirty是OS memory management的事,與prefetch跟cache都無關。

Program prefetch指進行了初步載入程式的分析,記錄下來,下次載入時便不用花時間去分析。可看看例如Windows的C:\Windows\Prefetch

FindFirstFile進行directory cache,與program prefetch無關。

現代的操作系统有很多不同方法去加速程式起動,特別是對經常執行的程式。

static data會否於執行後釋放是OS memory management管。與使用甚麼programming languages無半點關系。程式若非reentrant,static variables或許會在再執行時直接重用memory,但再執行時會先再進行初始化。

在未再執行程式前,相關的memory是mark dirty,任何其它程式都可拿去用,但其它程式用的時候OS要進行多一些管理事情,不像直接重用般,unmark dirty便可。

至於為何malloc在釋放時出錯,要看具體碼才能得知。
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.15625