Re: [問題] delete 不即時?

看板C_and_CPP (C/C++)作者 (香蕉公車)時間16年前 (2010/04/21 06:30), 編輯推噓3(3018)
留言21則, 4人參與, 最新討論串1/1
※ 引述《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

04/21 09:28, , 1F
怪怪的, new與delete應該作用於你process的virtual
04/21 09:28, 1F

04/21 09:29, , 2F
memory space; 至於會不會持續佔用physical memory, 這
04/21 09:29, 2F

04/21 09:30, , 3F
是OS的memory management的行為....@_@"
04/21 09:30, 3F

04/21 09:31, , 4F
剛才發現原文的a大其實已經提過這一點了....Orz
04/21 09:31, 4F

04/21 09:31, , 5F
原文 推文的 a大, 補字....囧rz
04/21 09:31, 5F
但是標準函式庫在實作時, 並不是在你 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)

04/21 09:50, , 6F
不過標準函式庫確實有可能也參一腳...實作有規定嗎?
04/21 09:50, 6F
不太懂你的意思, 實作應該是沒有規定應該要怎麼做. 至少在我看的 c spec 是沒有 (也許是我看得不夠仔細), 但我想一般是不會頻繁的使用 system call 來調整 memory 的使用. ※ 編輯: operationcow 來自: 140.112.243.43 (04/21 10:11)

04/21 11:18, , 7F
要是要了 8k, 4k, 16k,然後 delete 了中間的 4k,當然不
04/21 11:18, 7F

04/21 11:18, , 8F
可能馬上就跟你縮回去。
04/21 11:18, 8F
請問 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)

04/21 11:27, , 9F
我之前使用vector的clear也有不會釋放的問題@@
04/21 11:27, 9F

04/21 11:36, , 10F
vector 本來 clear 就不會釋放...
04/21 11:36, 10F

04/21 11:37, , 11F
至少有兩本書教過大家用 swap 的方法釋放 vector 的空間
04/21 11:37, 11F

04/21 11:59, , 12F
現在有點搞不清楚你要釋放Vir Addr Sp還是Phy Mem了說??
04/21 11:59, 12F

04/21 11:59, , 13F
但是, 如果你要做你說的去pack, 一個是memcopy的額外負
04/21 11:59, 13F

04/21 12:00, , 14F
擔會很重, 另一個是你需要再implement一個remap table,
04/21 12:00, 14F

04/21 12:00, , 15F
才能重新map AP端的Vir Addr到你搬移好的Vir Addr去吧??
04/21 12:00, 15F

04/21 12:01, , 16F
感覺這麼做, overhead太大, gain不到實質好處說@_@"
04/21 12:01, 16F

04/21 12:31, , 17F
C 的 pointer 存放的就是 virtual address,你移動的話這
04/21 12:31, 17F

04/21 12:32, , 18F
些 pointer 的值也要跟著改,這幾乎不太可能追蹤出來。
04/21 12:32, 18F

04/21 12:33, , 19F
要是有 pointer 指到那個 16k 起始點,要怎麼 update 它?
04/21 12:33, 19F
沒錯, 你說的對, 在這個 model 底下的確無法完成 update 所有指標這個 issue, 受教了 <(__)>

04/21 12:36, , 20F
對不起, t大說的是對的, 只知道起點根本沒有用, 變數存
04/21 12:36, 20F

04/21 12:36, , 21F
的是位址還是值根本無法判定, 所以根本不可能追蹤Orz
04/21 12:36, 21F
※ 編輯: operationcow 來自: 140.112.243.43 (04/21 14:33)
文章代碼(AID): #1BpYiLrz (C_and_CPP)
文章代碼(AID): #1BpYiLrz (C_and_CPP)