思索了好几个小时没找到答案,想请教下大神们,这是为什么呢?

自定义mynew和myfree函数,如果myfree函数中num 的类型为int,在运行过程中,ps aux看到程序的RSS一直增加(不降下来),存在内存泄漏。
如果myfree函数中num的类型为size_t,那么RSS就不会增加
PS:机器是64位的,sizeof(size_t)=8位,sizeof(int)=4位

void* mynew(size_t sz)
{
void* p = malloc(sizeof(size_t) + sz) ;
memcpy(p, &sz, sizeof(size_t));
pthread_mutex_lock(&mutex);
mCnt += sz + sizeof(size_t);
printf("malloc sz[%d], mCnt[%d], fCnt[%d]\n", sz+sizeof(size_t), mCnt, fCnt);
pthread_mutex_unlock(&mutex);
return p+sizeof(size_t);
}

void myfree(void* prt)
{
void* p = prt - sizeof(size_t);
if (p == NULL)
{
printf("pbuf is NULL\n");
return ;
}
size_t num = 0;
memcpy(&num, p, sizeof(size_t));
pthread_mutex_lock(&mutex);
fCnt += num + sizeof(size_t);
printf("free sz[%d], fCnt[%d], mCnt[%d]\n", num, fCnt, mCnt);
pthread_mutex_unlock(&mutex);
free(p);
}

慕村9548890
浏览 88回答 1
1回答

宝慕林4294392

具体来说,myfree中的num变量在内存中紧邻着p变量,如果你将num申明为int,那他只占四个字节,而你初始化num的时候 &nbsp;memcpy(&num, p, sizeof(size_t)); &nbsp; 却会将8个字节拷进去,这会修改紧邻这num的变量p,直接导致p被清零(如果malloc free外加修改的话,清的不一定是0),而free函数在传入空指针是不做处理的。我把代码修改了一下,你可以看一下下面程序的输出,对应myfree的free那一行,实际被free的是空指针。#include&nbsp;<stdio.h>#include&nbsp;<malloc.h>#include&nbsp;<pthread.h>#include&nbsp;<unistd.h>&nbsp;int&nbsp;fCnt&nbsp;=&nbsp;0,&nbsp;mCnt&nbsp;=&nbsp;0;&nbsp;pthread_mutex_t&nbsp;mutex;&nbsp;void&nbsp;*mynew(size_t&nbsp;sz)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*p&nbsp;=&nbsp;malloc(sizeof(size_t)&nbsp;+&nbsp;sz);&nbsp;&nbsp;&nbsp;&nbsp;memcpy(p,&nbsp;&sz,&nbsp;sizeof(size_t));&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(&mutex);&nbsp;&nbsp;&nbsp;&nbsp;mCnt&nbsp;+=&nbsp;sz&nbsp;+&nbsp;sizeof(size_t);&nbsp;&nbsp;&nbsp;&nbsp;printf("malloc&nbsp;sz[%d],&nbsp;mCnt[%d],&nbsp;fCnt[%d]\n",&nbsp;sz&nbsp;+&nbsp;sizeof(size_t),&nbsp;mCnt,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fCnt);&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(&mutex);&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;p&nbsp;+&nbsp;sizeof(size_t);}&nbsp;void&nbsp;myfree(void&nbsp;*prt)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*p&nbsp;=&nbsp;prt&nbsp;-&nbsp;sizeof(size_t);&nbsp;&nbsp;&nbsp;&nbsp;if(p&nbsp;==&nbsp;NULL)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pbuf&nbsp;is&nbsp;NULL\n");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;num&nbsp;=&nbsp;0;&nbsp;//&nbsp;error!&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;size_t&nbsp;num&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;printf("%p,&nbsp;%p\n",&nbsp;&p,&nbsp;&num);&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&num,&nbsp;p,&nbsp;sizeof(size_t));&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(&mutex);&nbsp;&nbsp;&nbsp;&nbsp;fCnt&nbsp;+=&nbsp;num&nbsp;+&nbsp;sizeof(size_t);&nbsp;&nbsp;&nbsp;&nbsp;printf("free&nbsp;sz[%d],&nbsp;fCnt[%d],&nbsp;mCnt[%d]\n",&nbsp;num,&nbsp;fCnt,&nbsp;mCnt);&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(&mutex);&nbsp;&nbsp;&nbsp;&nbsp;printf("try&nbsp;to&nbsp;free&nbsp;%p\n",&nbsp;p);&nbsp;&nbsp;&nbsp;&nbsp;free(p);}&nbsp;int&nbsp;main()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*p&nbsp;=&nbsp;mynew(100);&nbsp;&nbsp;&nbsp;&nbsp;printf("p&nbsp;is&nbsp;%p\n",&nbsp;p);&nbsp;&nbsp;&nbsp;&nbsp;myfree(p);&nbsp;&nbsp;&nbsp;&nbsp;usleep(1000000);&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}
打开App,查看更多内容
随时随地看视频慕课网APP