为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕村9548890 2023-03-03 16:12:54
自定义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;}


查看完整回答
反对 回复 2023-03-06
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信