亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3849 | 回復: 7
打印 上一主題 下一主題

c hash鏈表 釋放空間的疑惑 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-04-27 17:12 |只看該作者 |倒序瀏覽
hash.tar (20 KB, 下載次數(shù): 83) 寫的一個hash鏈表,申請了1000000個桶里面放500000條數(shù)據(jù),然后查詢,刪除,最后釋放鏈表 hash_close。
可是在本進程退出之前,明明已經(jīng)釋放了所有的申請空間,但是本進程還是占了40M內(nèi)存(用free -m看到的),
但是用valgrind檢測:
#valgrind --tool=memcheck --leak-check=full -v ./hash_test
結果是:
==8627== HEAP SUMMARY:
==8627==     in use at exit: 0 bytes in 0 blocks
==8627==   total heap usage: 1,500,005 allocs, 1,500,005 frees, 58,777,857 bytes allocated
==8627==
==8627== All heap blocks were freed -- no leaks are possible
==8627==
==8627== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 3 from 3)
--8627--
--8627-- used_suppression:      3 dl-hack3-cond-1
==8627==
==8627== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 3 from 3)
提示沒有內(nèi)存泄露。

這是怎么回事。
已經(jīng)附上源碼。

論壇徽章:
0
2 [報告]
發(fā)表于 2011-04-28 09:27 |只看該作者
本帖最后由 hebingyue 于 2011-04-28 10:34 編輯

代碼不到300行,里面有編譯腳本,熱心的cu們,測試下吧,在此謝過。。
跟蹤代碼到 elf_hash.c文件中:
259                 free_list_node( tmp );
釋放hash節(jié)點,注釋和不注釋占用內(nèi)存沒有變化,感覺是釋放沒起作用。
我的做法是先定位到雙向鏈表尾部,從后往前刪除。
明明已經(jīng)調(diào)用釋放,為什么沒起作用?

論壇徽章:
0
3 [報告]
發(fā)表于 2011-04-28 12:23 |只看該作者
有可能是上百萬次 malloc 和 free 造成內(nèi)存碎片?但是內(nèi)存碎片也應該是空閑的,而不是算到本進程下?

論壇徽章:
0
4 [報告]
發(fā)表于 2011-04-29 16:22 |只看該作者
第一次發(fā)帖竟然這么冷清,是我問題沒有描述明白呢,還是提問方式不對啊。

論壇徽章:
0
5 [報告]
發(fā)表于 2011-04-29 17:58 |只看該作者
最近進行了一些測試:
得出以下結論
1、代碼本身沒有內(nèi)存泄露,valgrind檢測結果是對的。
2、造成進程占用內(nèi)存虛高的原因是 malloc分配調(diào)用sbrk系統(tǒng)調(diào)用實現(xiàn),該系統(tǒng)調(diào)用擴充(或縮。┍具M程的堆。
雖然sbrk可以擴充或縮小進程堆空間,但大多數(shù)malloc和free的實現(xiàn)都不減少進程的存儲空間(特殊情況下會減少,
見第三點)。釋放的空間可供以后再分配,但通常將他們保持在malloc池中而不返給內(nèi)核。(參考 unix環(huán)境高級
編程 7.8節(jié),155頁)
3、那要是在使用過程中頻繁申請了大量內(nèi)存,后續(xù)不再使用,但進程常駐內(nèi)存,內(nèi)存塊是不是永遠被本進程鎖定呢?
由于前面的鏈表節(jié)點都是40~50個字節(jié),因此造成大量小塊內(nèi)存沒有返還內(nèi)核并回收,估計頻繁回收對內(nèi)核也是個挑戰(zhàn)。
我測試發(fā)現(xiàn)了一個方法,在釋放后申請一個稍大的內(nèi)存塊(比如 100K),然后把其釋放掉,
這樣觸發(fā)了內(nèi)存回收機制(猜測的,沒有確認),把前面申請到的大片小內(nèi)存塊給一起回收了。
內(nèi)存又回來啦.....

論壇徽章:
0
6 [報告]
發(fā)表于 2011-05-02 18:13 |只看該作者
只要申請一次就足夠了

論壇徽章:
0
7 [報告]
發(fā)表于 2011-05-02 18:16 |只看該作者
只要申請一次就足夠了

論壇徽章:
0
8 [報告]
發(fā)表于 2011-05-11 17:41 |只看該作者
其實這也說明了為什么申請的小塊內(nèi)存free后,指針還可以使用。因為申請的空間太小了,系統(tǒng)沒必要立即回收到內(nèi)核,暫時放在本進程空間,但這段內(nèi)存隨時可能被再次申請使用。
所以指針釋放后,再次使用就像抱者yk炸彈,隨時可能crash.
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP