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语言自动发现泄漏的内存的更多相关文章

  1. zabbix自动发现与监控内存和CPU使用率最高的进程,监测路由器

    https://cloud.tencent.com/info/488cfc410f29d110c03bcf0faaac55b2.html         (未测试) https://www.cnblo ...

  2. 巧用Salt,实现CMDB配置自动发现

    随着互联网+新形势的发展,越来越多的企业步入双态(稳敏双态)IT时代,信息化环境越来越复杂,既有IOE三层架构,也有VCE.Openstack等云虚拟化架构和互联网化的分布式大数据架构.所以,企业急需 ...

  3. docker部署zabbix并设置自动发现规则

      docker部署zabbix比源码安装简单一些,特此记录: 机器准备: zabbix-server: 192.168.0.150 homeserver zabbix-agent: 192.168. ...

  4. PAC 代理自动发现简介

    一 简介 1.1 什么是PAC文件 代理自动配置(PAC)文件包含一组用javaScript编码的规则,允许web浏览器确定是将Web流量直接发送到Internet还是通过代理服务器发送        ...

  5. ZABBIX自动发现Redis端口并监控

    由于一台服务器开启许多Redis实例,如果一台一台的监控太耗费时间,也非常容器出错.这种费力不讨好的事情我们是坚决杜绝的,幸好ZABBIX有自动发现功能,今天我们就来用该功能来监控我们的Redis实例 ...

  6. zabbix自动发现功能实现批量web url监控

    需求: 现在有大量url需要监控,形式如http://www.baidu.com ,要求url状态不为200即报警. 需求详细分析: 大量的url,且url经常变化,现在监控用的是zabbix,如果手 ...

  7. zabbix_server的自动发现,实现批量添加主机,并链接到模板

    一.需求 zabbix 服务器可以手动加入zabbix-agent客户端,对于少量的机器,这没有什么.但到了线上,我们有大量的服务器需要监控时,如果再一个个的手动加的话,工作量势必会增加很多.这时,z ...

  8. zabbix自动发现监控url

    1.在监控客户机上 web_site_code_status.sh: #!/bin/bash UrlFile="/opt/scripts/WEB.txt" IFS=$'\n' we ...

  9. Docker集群实验环境布署--swarm【3 注册服务监控与自动发现组件--consul】

    参考官网集群配置方式 https://hub.docker.com/r/progrium/consul/   集群中需要manager与node能通信consul的发现服务,不然,管理节点选举不了,无 ...

随机推荐

  1. 【转】【iOS】导航栏那些事儿

    原文网址:http://www.jianshu.com/p/f797793d683f 参考文章 navigationItem UINavigationItem UINavigationBar UIBa ...

  2. SharePoint 2010 master page 控件介绍(5):其他

    转:http://blog.csdn.net/lgm97/article/details/6409227 <!-- 处理搜索按下"enter"键和点击后退按钮 --> ...

  3. 转载:C++ 虚函数表解析

    目录(?)[+]   转载:http://blog.csdn.net/haoel/article/details/1948051# 前言 C++中 的虚函数的作用主要是实现了多态的机制.关于多态,简而 ...

  4. POJ 2828-Buy Tickets(线段树)

    题意: 有n个人,每人有一定的价值,给n个安排,每次安排有两个数 p,v p是这个人前面人的个数 (直接插在第p个人后面其他人后移),v是它的价值,n个安排后 求最终的价值序列. 分析: 越在后面的安 ...

  5. [转]VPN服务器配置详解

    借助VPN,企业外出人员可随时连到企业的VPN服务器,进而连接到企业内部网络.借助windows2003的“路由和远程访问”服务,可以实现基于软件的VPN. VPN(Virtual Private N ...

  6. as3+java+mysql(mybatis) 数据自动工具(四)

    现在介绍一下只配置 as3 与 java 公用的数据类,这种配置一般是该数据类只需要在 as3 与 java 之间转换,跟数据库没有关系.比如在客户端与服务端的数据交换中,需要定义一个统一返回请求的数 ...

  7. NOIP2014 寻找道路

    2.寻找道路 (road.cpp/c/pas) [问题描述] 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指 ...

  8. HW5.36

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  9. 【推荐】JavaScript的那些书

    又好久没写东西了,写上一篇的时候还以为接下来的工作会轻松一些,结果未从我所愿呐,又是一阵忙碌.而这段时间穿插着做了很多12年淘宝校园招聘的前端面试,很多同学都有问到,学校里没有前端的课程,那如何学习J ...

  10. 射频识别技术漫谈(15)——Mifare1的安全性及7字节序列号M1卡【worlsing笔记】

    Mifare1的安全性主要指卡中数据的安全性,要求卡中的数据不能被非法修改或窃听.数据的安全性主要使用加密技术来保证,加密技术有两个关键因素:加密算法和密钥.现代加密技术的一大特点是加密算法公开,如果 ...