这是代码示例
它会创建一个分离的pthread
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *show_message( void *ptr )
{
char *message;
message = (char *) ptr;
printf("[%s] start\n", message);
int x = 3;
for(x = 3 ; x > 0 ; --x){
printf("%s \n", message);
sleep(2);
}
printf("[%s] end\n", message);
}
int create_thread(char *message)
{
pthread_attr_t att;
pthread_attr_init(&att);
pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED);
pthread_t thread;
pthread_create(&thread, &att, show_message, (void*)message);
return 0;
}
int main(){
sleep(3);
create_thread("Thread 1");
while(1) {};
return 0;
}
Valgrind结果显示没有泄漏
== 9872 ==堆摘要:
== 9872 ==在出口处使用:0字节,0块中
== 9872 ==堆总使用量:2个分配,2个空闲,分配的1,296字节
== 9872 ==
== 9872 ==所有堆块都已释放-不可能泄漏
但是我读到/ proc / [pid] / statm
人数和居民人数增加
[~] $ while [ 1 ]; do cat /proc/`pidof pthread_example`/statm; sleep 2; done
1596 218 198 1 0 50 0 <-运行
1596 218 198 1 0 50 0
20062 218 198 1 0 18516 0 <-[线程1]开始
20062 218 198 1 0 18516 0
20062 218 198 1 0 18516 0
20062 299 278 1 0 18516 0 <-[线程1]结束
20062 299 278 1 0 18516 0
为什么?
答案 0 :(得分:1)
如果您要问为什么释放内存时进程的内存大小没有减少,那实际上很简单。
如果进程中需要额外的内存(例如,当您尝试分配一些内存,但没有足够的内存供您分配)时,该进程将从操作系统中请求更多的内存。
但是,当您释放该内存时,并不需要将其真正重新获得给操作系统,更可能是在某个时候再次需要它,因此该过程将其保持不变以防万一。
这样想:
A B C
+--------+ +--------+ +--------+
| Memory | | Memory | | Memory |
| for | <-> | in | <- | in |
| you | | heap | | OS |
+--------+ +--------+ +--------+
分配和释放内存时,内存可能在A
和B
之间双向流动,但只能从流出 {{ 1}}至C
。当然,当您的进程退出时,将返回B
中保留的任何内容。
请记住,这是一个概念描述,操作系统中可能没有 actual 内存,更准确地说可能是操作系统只是在扩展您的地址空间到更大的尺寸。您拥有的任何虚拟内存管理器都会根据需要分配实际内存。