【面试题】如何让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的发现服务,不然,管理节点选举不了,无 ...
随机推荐
- 【转】Android学习基础自定义Checkbox组件
原文网址:http://forum.maiziedu.com/thread-515-1-1.html heckbox组件是一种可同时选中多项的基础控件,即复选框,在android学习中,Checkbo ...
- 【转】 Homebrew – OSX下简单的包管理系统
很多linux用户很喜欢 (Debian/Ubuntu)系列的apt包管理系统和(Redhat/Fedora)系列的yum包管理系统. 包括Windows用户都有多种方便的软件管理工具,如:360软件 ...
- a标签中的label在IE下触发不了a标签的href链接(label标签——解析)
<a href="http://www.baidu.com/" target="_blank"> <span>百度</span&g ...
- 如何使用UDP进行跨网段广播
广播域首先我们来了解一下广播域的概念.广播域是网络中能接收任一台主机发出的广播帧的所有主机集合.也就是说,如果广播域内的其中一台主机发出一个广播帧,同一广播域内所有的其它主机都可以收到该广播帧.广播域 ...
- expunge
expunge 擦掉: 除去: 删去: 消除 1. The experience was something he had tried to expunge from his memory. 他曾努力 ...
- 【opencv】图像细化
[原文:http://blog.csdn.net/qianchenglenger/article/details/19332011] 在我们进行图像处理的时候,有可能需要对图像进行细化,提取出图像的骨 ...
- Colors
.custom_a1, .custom_a2, .custom_a3, .custom_a4{ width:800px; height:100px; line-height:100px; color: ...
- 4.4 CUDA prefix sum一步一步优化
1. Prefix Sum 前缀求和由一个二元操作符和一个输入向量组成,虽然名字叫求和,但操作符不一定是加法.先解释一下,以加法为例: 第一行是输入,第二行是对应的输出.可以看到,Output[1] ...
- matlab 函数说明--fspecial
好吧,这个函数在图像处理中运用得非常广泛,虽然我还是觉得不知道为啥要取这个名字,fspecial的作用如下: 产生一个预定义的2D 滤波器(create a predefined 2D ...
- 单点登录sso规范
http://jasig.github.io/cas/development/protocol/CAS-Protocol-Specification.html