【面试题】如何让C语言自动发现泄漏的内存
来源:互联网 发布:国标网络协议 编辑:程序博客网 时间:2024/06/09 16:34
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语言自动发现泄漏的内存
- 如何发现内存泄漏
- 【C语言】如何判断出现内存泄漏
- c语言的面试题
- 关于如何发现Delphi程序的内存泄漏
- 关于面试题java内存泄漏想到的(1)
- 关于面试题java内存泄漏想到的(2)
- 关于面试题java内存泄漏想到的(3)
- C语言内存泄漏检测
- C语言面试题
- C语言面试题
- C语言面试题
- C语言面试题
- c语言面试题
- c语言面试题
- C语言面试题
- c语言面试题
- C语言面试题
- Programme Diary -文档查看
- Oracle中start with...connect by prior子句用法
- VMware vSphere学习之架构
- lr录制文件下载的脚本
- 各种各样的jdbc数据库连接方式【目前关注Altibase和timesten】
- 【面试题】如何让C语言自动发现泄漏的内存
- jsp获取当前路径
- CSharp Algorithm - How to traverse binary tree by breadth (Part II)
- C语言如何产生随机数
- HDU Moving Tables
- 在Qt creator中使用Qt for VS2008建立Debug工具
- [HDU 3308]LCIS[线段树][区间合并]
- MainActivity 会异步加载图片到相应的ImageView上
- 汉字的存放顺序和传输顺序是不一样的