【面试题】如何让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的发现服务,不然,管理节点选举不了,无 ...
随机推荐
- './mysql-bin.index' not found (Errcode: 13) 的解决方法
将文件系统复制到PC机上,然后再拷贝到别的SD卡后,发现mysql无法启动了,首先检查了一下mysql的错误日志,发现最后出现以下错误: /usr/local/mysql/libexec/mysqld ...
- Oracle数据库安装后,登录Database Control时密码错误
解决方案1(实测可行): sys 和 system用户的用户名和密码还记得不?试试看如果不行,用sqlplus 在服务器本地登录%sqlplus / as sysdbaSQL>alter use ...
- 《Python基础教程(第二版)》学习笔记 -> 第六章 抽象
抽象和结构 本章将会介绍如何让将语句组织成函数,还会详细介绍参数(parameter)和作用域(scope)的概念,以及递归的概念及其在程序中的用途. 创建函数 函数可以调用,它执行某种行为,并返回某 ...
- Js(Jquery)实现的弹出窗口
想实现一个弹出层,过一段时间自动消失的功能. 之前的项目中是:在页面中预先先一个<div>区域,默认隐藏或者因为没有内容不显示.当需要显示信息时,将该<div>填充上内容,并用 ...
- 【暑假】[深入动态规划]UVa 10618 Tango Tango Insurrection
UVa 10618 Tango Tango Insurrection 题目: Problem A: Tango Tango Insurrection You are attempting to lea ...
- Barcode記錄
.net開源框架 Barcode Rendering Framework URL:http://barcoderender.codeplex.com/releases/view/91902 可產生BR ...
- nyoj 975 关于521
关于521 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去. 浏览网页的流年忽然看到了网上有人用玫 ...
- 浅析作用域链–JS基础核心之一
JS中的作用域,大家都知道的,分为全局作用域和局部作用域,没有块级作用域,听起来其实很简单的,可是作用域是否能够有深入的了解,对于JS代码逻辑的编写成功率,BUG的解决能力,以及是否能写出更优秀的代码 ...
- [一]初识Json
JSON 对象{ "name":"张三" , "age":22}JSON 数组{"student": [{ " ...
- iOS多线程拾贝------操作巨人编程
iOS多线程拾贝------操作巨人编程 多线程 基本 实现方案:pthread - NSThread - GCD - NSOperation Pthread 多平台,可移植 c语言,要程序员管理生命 ...