自定义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);}
1 回答
宝慕林4294392
TA贡献2021条经验 获得超8个赞
具体来说,myfree中的num变量在内存中紧邻着p变量,如果你将num申明为int,那他只占四个字节,而你初始化num的时候 memcpy(&num, p, sizeof(size_t)); 却会将8个字节拷进去,这会修改紧邻这num的变量p,直接导致p被清零(如果malloc free外加修改的话,清的不一定是0),而free函数在传入空指针是不做处理的。我把代码修改了一下,你可以看一下下面程序的输出,对应myfree的free那一行,实际被free的是空指针。
#include <stdio.h>#include <malloc.h>#include <pthread.h>#include <unistd.h> int fCnt = 0, mCnt = 0; pthread_mutex_t mutex; 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; } int num = 0; // error! // size_t num = 0; printf("%p, %p\n", &p, &num); 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); printf("try to free %p\n", p); free(p);} int main() { void *p = mynew(100); printf("p is %p\n", p); myfree(p); usleep(1000000); return 0;} |
- 1 回答
- 0 关注
- 170 浏览
添加回答
举报
0/150
提交
取消
