[問題] 在thread裡面free memory
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux 4.12.13-1-ARCH x86_64
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
gcc 7.2.0
Glibc 2.26
問題(Question):
我想要在main裡面malloc後把指標傳到thread裡,在thread結束前free記憶體。
結果記憶體用量會隨著操作次數漸漸變大。
程式大致上長像這樣:
void *test(void *p)
{
pthread_detach(pthread_self());
free(p);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
... other code ...
pthread_t tid;
void *p = malloc(8*1024*1024);
pthread_create(&tid, NULL, test, p);
... other code ...
}
在main裡面做了很多次malloc、pthread_create的動作。
有確認過free都有執行到,如果不做malloc、free,單純建立theard然後退出都正常。
不過兩者合在一起用的時候就漸漸的把記憶體吃掉了。
還有哪裡可能有記憶體沒釋放到嗎?
預期的正確結果(Expected Output):
記憶體用量不會一直增加
錯誤結果(Wrong Output):
記憶體用量漸漸增加
程式碼(Code):(請善用置底文網頁, 記得排版)
完整的程式:https://ideone.com/SKWT5Q
補充說明(Supplement):
1.執行程式每次被吃的記憶體量會有一點點不一樣。
2.如果是在main裡面free的話就不會這樣。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.241.143
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1512477084.A.9EE.html
推
12/05 20:44,
8年前
, 1F
12/05 20:44, 1F
→
12/05 20:44,
8年前
, 2F
12/05 20:44, 2F
→
12/05 21:01,
8年前
, 3F
12/05 21:01, 3F
我有cat /proc/${pid}/status看過,最後Threads=1。
malloc要多少個分頁會有影響嗎?我設這麼大是想說如果沒free到應該會很明顯。
不過我的程式不會佔到那麼大,這個動作大概做1000次才會多吃1Mib左右的空間。
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 21:15:24
→
12/05 21:09,
8年前
, 4F
12/05 21:09, 4F
我是看網路上有人這樣用 OwO
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 21:21:50
→
12/05 21:37,
8年前
, 5F
12/05 21:37, 5F
不太懂你的意思,我都在pthread_exit前一道指令free的,如果有thread卡住的話剩下的
thread應該不會只有1條。
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 21:45:44
推
12/05 21:43,
8年前
, 6F
12/05 21:43, 6F
我有對malloc、free加互斥鎖過,結果一樣。(這個example比較單純,應該還好)
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 21:47:59
→
12/05 21:48,
8年前
, 7F
12/05 21:48, 7F
→
12/05 21:49,
8年前
, 8F
12/05 21:49, 8F
OK,glibc版本2.26(其他有更新在上面)
→
12/05 21:49,
8年前
, 9F
12/05 21:49, 9F
推
12/05 22:01,
8年前
, 10F
12/05 22:01, 10F
→
12/05 22:01,
8年前
, 11F
12/05 22:01, 11F
https://ideone.com/SKWT5Q
這個是我把遇到的情況簡化過的,它的確會慢慢變大,for迴圈多跑個幾次就看的出來。
還是你是想看我的作業>///<,已經被我改成在main裡面free了 @w@
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 22:14:17
→
12/05 22:20,
8年前
, 12F
12/05 22:20, 12F
→
12/05 22:20,
8年前
, 13F
12/05 22:20, 13F
→
12/05 22:21,
8年前
, 14F
12/05 22:21, 14F
用malloc_stats看了之後覺得很奇怪,每次in use bytes都增加1184 bytes,那是啥?
是說我試過配置較小的記憶體了,不過用量還是會慢慢變大...
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 22:41:25
→
12/05 22:46,
8年前
, 15F
12/05 22:46, 15F
8個byte~
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 23:04:45
推
12/05 23:11,
8年前
, 16F
12/05 23:11, 16F
→
12/05 23:19,
8年前
, 17F
12/05 23:19, 17F
→
12/05 23:20,
8年前
, 18F
12/05 23:20, 18F
用top跟你說的malloc_stats看的,不然我明天用valgrind、換台電腦試試看好了。
(好像在哪邊看到說free不一定會馬上還給系統,不過應該不是這個問題。因為我free完用
malloc可以得到相同的位置,可是還是會越吃越多Q_Q)
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 23:25:29
推
12/06 10:46,
8年前
, 19F
12/06 10:46, 19F
→
12/06 10:47,
8年前
, 20F
12/06 10:47, 20F
→
12/06 10:56,
8年前
, 21F
12/06 10:56, 21F
改成無窮迴圈一直跑就能看到它越來越大隻了。
用valgrind看有時候有still reachable: 1,612 bytes in 4 blocks,有時候又沒有。
偶爾還底下還會出現:ERROR SUMMARY: 1 errors from 1 contexts。
※ 編輯: Lipraxde (140.118.202.43), 12/06/2017 12:05:53
→
12/06 13:29,
8年前
, 22F
12/06 13:29, 22F
→
12/06 13:30,
8年前
, 23F
12/06 13:30, 23F
→
12/06 13:31,
8年前
, 24F
12/06 13:31, 24F
→
12/06 13:47,
8年前
, 25F
12/06 13:47, 25F
→
12/06 13:47,
8年前
, 26F
12/06 13:47, 26F
→
12/06 13:47,
8年前
, 27F
12/06 13:47, 27F
→
12/06 13:47,
8年前
, 28F
12/06 13:47, 28F
→
12/06 13:47,
8年前
, 29F
12/06 13:47, 29F
→
12/06 13:47,
8年前
, 30F
12/06 13:47, 30F
→
12/06 14:00,
8年前
, 31F
12/06 14:00, 31F
→
12/06 14:01,
8年前
, 32F
12/06 14:01, 32F
→
12/06 14:02,
8年前
, 33F
12/06 14:02, 33F
→
12/06 14:02,
8年前
, 34F
12/06 14:02, 34F
→
12/06 14:02,
8年前
, 35F
12/06 14:02, 35F
→
12/06 14:03,
8年前
, 36F
12/06 14:03, 36F
→
12/06 14:07,
8年前
, 37F
12/06 14:07, 37F
→
12/06 14:07,
8年前
, 38F
12/06 14:07, 38F
→
12/06 14:23,
8年前
, 39F
12/06 14:23, 39F
→
12/06 14:24,
8年前
, 40F
12/06 14:24, 40F
→
12/06 14:25,
8年前
, 41F
12/06 14:25, 41F
→
12/06 14:25,
8年前
, 42F
12/06 14:25, 42F
→
12/06 14:48,
8年前
, 43F
12/06 14:48, 43F
→
12/06 14:48,
8年前
, 44F
12/06 14:48, 44F
→
12/06 14:48,
8年前
, 45F
12/06 14:48, 45F
→
12/06 14:48,
8年前
, 46F
12/06 14:48, 46F