看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《justdemon (人生的轉捩點)》之銘言: : 標題: [問題] delete 不即時? : 時間: Wed Jun 11 13:56:13 2008 : : : : delete這個指令 是否一定會即時釋放記憶體呢?? : : : 我遇到了記憶體吃到swap的問題 : : 把程式用getchar分段來看記憶體使用的狀況 : : 發現有時候我delete之後 記憶體並沒有即時的被釋放出來 : : 造成吃到swap的情況 : : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 140.112.231.98 : 推 Bencrie:跟OS管理記憶體的方式有關。 06/11 14:02 ^^^^^^^^^^^^^^^^^^^^^^^^ 我想請問的是, delete 真的釋放 memory 的時間點(即不占有 physical memory), 是否"也"與其標準函式庫的實作有相關(如 free, malloc ... 等). 而不是只和 OS 管理記憶體的方式有關 感謝感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.243.43
VictorTom:怪怪的, new與delete應該作用於你process的virtual 04/21 09:28
VictorTom:memory space; 至於會不會持續佔用physical memory, 這 04/21 09:29
VictorTom:是OS的memory management的行為....@_@" 04/21 09:30
VictorTom:剛才發現原文的a大其實已經提過這一點了....Orz 04/21 09:31
VictorTom:原文 推文的 a大, 補字....囧rz 04/21 09:31
但是標準函式庫在實作時, 並不是在你 new 時就會使用 system call 來只向作業系統 申請所需要的 memory. 而是一次申請一大塊, 自己有其管理機制. 因此 delete 時也不 見得會馬上使用 brk 等 system call 來調整其 virtual address space. 所以我認為跟 Kernel 及所採用的 C Run-Time Liabrary 都有關係 ※ 編輯: operationcow 來自: 140.112.243.43 (04/21 10:03)
james732:不過標準函式庫確實有可能也參一腳...實作有規定嗎? 04/21 09:50
不太懂你的意思, 實作應該是沒有規定應該要怎麼做. 至少在我看的 c spec 是沒有 (也許是我看得不夠仔細), 但我想一般是不會頻繁的使用 system call 來調整 memory 的使用. ※ 編輯: operationcow 來自: 140.112.243.43 (04/21 10:11)
tinlans:要是要了 8k, 4k, 16k,然後 delete 了中間的 4k,當然不 04/21 11:18
tinlans:可能馬上就跟你縮回去。 04/21 11:18
請問 t 大, 如果是以 4k 為單位(如你舉的例子), 剛好是作業系統常見的一個 page 的 長度, 在 CRT 實作中, 是否可以有以下方式以釋放 virtual address space?? (欲在程式裡面把 heap 後面 16k 的資料直接往前移動 4k, CRT 所作步驟 a. 更改 CRT 管理 heap 的資料結構, b. 將後面 16k 的資料往前 copy 移動 4k, 其中 b 其實只要 作業系統最佳化時察覺到/CRT向系統申請 直接更改 MMU 的對應即可) 感謝感謝 ※ 編輯: operationcow 來自: 140.112.243.43 (04/21 11:40)
GGing:我之前使用vector的clear也有不會釋放的問題@@ 04/21 11:27
tinlans:vector 本來 clear 就不會釋放... 04/21 11:36
tinlans:至少有兩本書教過大家用 swap 的方法釋放 vector 的空間 04/21 11:37
VictorTom:現在有點搞不清楚你要釋放Vir Addr Sp還是Phy Mem了說?? 04/21 11:59
VictorTom:但是, 如果你要做你說的去pack, 一個是memcopy的額外負 04/21 11:59
VictorTom:擔會很重, 另一個是你需要再implement一個remap table, 04/21 12:00
VictorTom:才能重新map AP端的Vir Addr到你搬移好的Vir Addr去吧?? 04/21 12:00
VictorTom:感覺這麼做, overhead太大, gain不到實質好處說@_@" 04/21 12:01
tinlans:C 的 pointer 存放的就是 virtual address,你移動的話這 04/21 12:31
tinlans:些 pointer 的值也要跟著改,這幾乎不太可能追蹤出來。 04/21 12:32
tinlans:要是有 pointer 指到那個 16k 起始點,要怎麼 update 它? 04/21 12:33
沒錯, 你說的對, 在這個 model 底下的確無法完成 update 所有指標這個 issue, 受教了 <(__)>
VictorTom:對不起, t大說的是對的, 只知道起點根本沒有用, 變數存 04/21 12:36
VictorTom:的是位址還是值根本無法判定, 所以根本不可能追蹤Orz 04/21 12:36
※ 編輯: operationcow 來自: 140.112.243.43 (04/21 14:33)