在Linux中运行的C程序出现内存泄漏现象,怎么解决?

发布网友 发布时间:2022-04-20 16:02

我来回答

1个回答

热心网友 时间:2023-09-10 09:07

具体来说,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;
}

追问num类型是int的时候,p指向的地址确实被覆盖了。没考虑到myfree函数中 变量 p 和变量 num 是在栈里面的,打印出来的地址&p确实是比&num高4位,谢啦。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com