【面试题】如何让C语言自动发现泄漏的内存
1. 题目
改造malloc和free函数,使C语言能自动发现泄漏的内存,在程序退出时打印中遗漏的内存地址和大小。
2. 思路
用一个链表来记录已经分配的内存地址。在malloc时,把分配的内存地址和大小插入链表;在free时,找到链表中相应结点,删除该结点。程序退出时,打印出链表中的结点。
上述思路有一个缺陷:删除结点时,需要遍历链表,如何才能变成常数时间能完成的操作?
方法是:在malloc时,多分配一块区域,用来记录链表结点的位置。
3. 代码
//Code 1
#include <stdlib.h> typedef struct _PtrNode
{
struct _PtrNode* prev;
struct _PtrNode* next;
void* locatedPtr;
int size;
}PtrNode; PtrNode* gRecordList; void InitList()
{
gRecordList = (PtrNode*)malloc(sizeof(PtrNode));
gRecordList->prev = NULL;
gRecordList->next = NULL;
} void InsertNode(PtrNode* pNode)
{
if (NULL != gRecordList->next)
{
gRecordList->next->prev = pNode;
}
pNode->next = gRecordList->next;
gRecordList->next = pNode;
pNode->prev = gRecordList;
} void DeleteNode(PtrNode* pNode)
{
if (NULL != pNode->next)
{
pNode->next->prev = pNode->prev;
}
pNode->prev->next = pNode->next;
free(pNode);
} void PrintLeek()
{
PtrNode* pNode;
for(pNode = gRecordList->next; pNode != NULL; pNode = pNode->next)
{
printf("leek:%x,%d\n", pNode->locatedPtr, pNode->size);
}
} void* MyMalloc(int size)
{
void* ptr = malloc(size + sizeof(PtrNode*));
PtrNode* pNode = (PtrNode*)malloc(sizeof(PtrNode));
pNode->locatedPtr = ptr;
pNode->size = size;
*(PtrNode**)(ptr + size) = pNode;
InsertNode(pNode);
return ptr;
} #define MyFree(pHandler) \
do {\
int size = sizeof(*pHandler); \
PtrNode* pNode = *(PtrNode**)((void*)pHandler + size);\
DeleteNode(pNode); \
free(pHandler);\
}while(0) int main()
{
InitList();
int* p = (int*)MyMalloc(sizeof(int));
p = (int*)MyMalloc(sizeof(int));
PtrNode* p2 = (PtrNode*)MyMalloc(sizeof(PtrNode));
MyFree(p);
PrintLeek();
}
【面试题】如何让C语言自动发现泄漏的内存的更多相关文章
- zabbix自动发现与监控内存和CPU使用率最高的进程,监测路由器
https://cloud.tencent.com/info/488cfc410f29d110c03bcf0faaac55b2.html (未测试) https://www.cnblo ...
- 巧用Salt,实现CMDB配置自动发现
随着互联网+新形势的发展,越来越多的企业步入双态(稳敏双态)IT时代,信息化环境越来越复杂,既有IOE三层架构,也有VCE.Openstack等云虚拟化架构和互联网化的分布式大数据架构.所以,企业急需 ...
- docker部署zabbix并设置自动发现规则
docker部署zabbix比源码安装简单一些,特此记录: 机器准备: zabbix-server: 192.168.0.150 homeserver zabbix-agent: 192.168. ...
- PAC 代理自动发现简介
一 简介 1.1 什么是PAC文件 代理自动配置(PAC)文件包含一组用javaScript编码的规则,允许web浏览器确定是将Web流量直接发送到Internet还是通过代理服务器发送 ...
- ZABBIX自动发现Redis端口并监控
由于一台服务器开启许多Redis实例,如果一台一台的监控太耗费时间,也非常容器出错.这种费力不讨好的事情我们是坚决杜绝的,幸好ZABBIX有自动发现功能,今天我们就来用该功能来监控我们的Redis实例 ...
- zabbix自动发现功能实现批量web url监控
需求: 现在有大量url需要监控,形式如http://www.baidu.com ,要求url状态不为200即报警. 需求详细分析: 大量的url,且url经常变化,现在监控用的是zabbix,如果手 ...
- zabbix_server的自动发现,实现批量添加主机,并链接到模板
一.需求 zabbix 服务器可以手动加入zabbix-agent客户端,对于少量的机器,这没有什么.但到了线上,我们有大量的服务器需要监控时,如果再一个个的手动加的话,工作量势必会增加很多.这时,z ...
- zabbix自动发现监控url
1.在监控客户机上 web_site_code_status.sh: #!/bin/bash UrlFile="/opt/scripts/WEB.txt" IFS=$'\n' we ...
- Docker集群实验环境布署--swarm【3 注册服务监控与自动发现组件--consul】
参考官网集群配置方式 https://hub.docker.com/r/progrium/consul/ 集群中需要manager与node能通信consul的发现服务,不然,管理节点选举不了,无 ...
随机推荐
- Java [leetcode 29]Divide Two Integers
题目描述: Divide two integers without using multiplication, division and mod operator. If it is overflow ...
- 【转】android新建项目时 出现appcompat_v7工程错误和红色感叹号
原文网址:http://www.cnblogs.com/xiaozhang2014/p/4109856.html 最近初学android,版本是22.6.0的话,每次创建一个项目就会出现一个appco ...
- 怎么找到MyEclipse->add struts capabilities
问:MyEclipse:我的工程右键可以MyEclipse->add struts capabilities之前有,后来不知怎么就没有了,谁知道怎么弄出来是struts 答:你已经add过一次了 ...
- 【Android】Android ListViewAnimations分析
使用:https://github.com/android-cn/android-open-project-demo/tree/master/listview-animations-demo APK例 ...
- jetty属性
jetty 版本信息 Jetty7 - 此插件更名为jetty-maven-plugin,以便更符合maven2的协定.为了在Web应用做快速应用开发做准备,详见多Web应用源目录. 为 ...
- xmbc 资源
http://raspberrypi.diandian.com/post/2013-02-25/40048470423 http://blog.csdn.net/lincyang/article/de ...
- jvm 漫谈 笔记
1.Jvm到底是什么呢? Jvm其实就是模拟一台计算机,每种cpu都有自己的指令集,jvm自己设置一套指令集,这就是我满看的的字节码,然后jvm需要执行这些字节码,其实这些字节码最终直接对应到cpu的 ...
- bzoj 2656 [Zjoi2012]数列(sequence)(高精度)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2656 [题意] 计算大数递推式 [思路] 高精度 [代码] #include<c ...
- 稀疏表示(sparse representation)和字典学习
近十几年来,稀疏(sparsity)已经成为信号处理及其应用领域中处于第一位的概念之一.近来,研究人员又致力于过完备(overcomplete)信号表示的研究.这种表示不同于许多传统的表示.因为它能提 ...
- 5.1 CUDA atomic原子操作
和许多多线程并行问题一样,CUDA也存在互斥访问的问题,即当一个线程改变变量X,而另外一个线程在读取变量X的值,执行原子操作类似于有一个自旋锁,只有等X的变量在改变完成之后,才能执行读操作,这样可以保 ...