直接贴代码

核心思想:

1、自己封装内存分配函数mymalloc,在该函数中将分配的内存地址,插入链表中。

2、自己封装内存释放函数myfree,将传入的内存地址从链表中删除。

3、程序末尾,再次检查链表中是否有数据,如果不为空,说明忘记释放,内存泄漏了,此时从链表中取个内存地址,依次释放。

#include<stdio.h>
#include<stdlib.h>
#include<cstl/clist.h>            //谷歌开源的
#include<cstl/calgorithm.h>       //谷歌开源的
list_t* pslist_coll1 = NULL;      //创建链表指针,并初始化
static void*mymalloc(size_t size)
{
    if (size <= 0)
    {
      return NULL;
    }
	void* p=malloc(size);    //将分配的地址插入链表
	list_push_front(pslist_coll1,p);
	return p;
}
static void myfree(void* p) 
{
	if (p != NULL)
	{
		list_remove(pslist_coll1,p);    //将释放的地址从链表删除
		free(p);
	}
}
static void _print(const void* cpv_input, void* pv_output)
{
	printf("%p ", cpv_input);    //打印链表中的地址
}

int main() 
{
	pslist_coll1 = create_list(void*);    //创建链表,地址数据本质就是void*类型
	list_init(pslist_coll1);              //链表初始化  
	void* p1=mymalloc(1);
	void* p2=mymalloc(1);
	void* p3=mymalloc(1);
	void* p4=mymalloc(1);
	
	printf("释放前的内存地址: ");
	algo_for_each(list_begin(pslist_coll1), list_end(pslist_coll1), _print); //链表遍历
	myfree(p1);
	myfree(p2);
	myfree(p3);
	myfree(p4);
	printf("\n释放后的内存地址: ");
	algo_for_each(list_begin(pslist_coll1), list_end(pslist_coll1), _print);
	getchar();
	return 0;
}

运行结果如图:

QQ图片20180915171353.png

个人交流qq:757368775

交流群:599151072

点赞(7)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 5 条评论

lvxuzhou 6年前 回复TA
@验题君 @zhangshuo 大佬客气了
lalalala 6年前 回复TA
@验题君 很专业的知识!!
验题君 6年前 回复TA
@验题君 已转发!多多分享啊!
lvxuzhou 6年前 回复TA
@验题君 哇,居然得到了大神的回帖啊,荣幸啊
验题君 6年前 回复TA
非常适合新人学习的知识啊