内存泄漏之malloc替换方法
//内存泄漏之malloc替换方法
//内存泄漏之malloc替换方法
#include "stdio.h"
#include "stdlib.h"
/*文件路径名长度,可以根据需要修改*/
#define patch_len 50
struct record
{
char name[patch_len+1];
unsigned int line;
unsigned int addr;
struct record *next;
};
#define Malloc(size) malloc_ext(size,__FUNCTION__, __LINE__)
#define Free(p) free_ext(p,__FUNCTION__, __LINE__)
void * malloc_ext(size_t size,const char *name, unsigned int line);
void free_ext(void * p,const char *name, unsigned int line);
struct record * add_record(struct record *head, unsigned int addr, unsigned int line, const char *name);
int delete_record(struct record *head, unsigned int addr);
void show_record(void);
/*定义未释放内存链表头节点*/
struct record * record_list = NULL;
struct record * add_record(struct record *head, unsigned int addr, unsigned int line, const char *name)
{
struct record *m = NULL;
struct record *n = NULL;
if(head == NULL)
{
head = (struct record*)malloc(sizeof(struct record));
head->addr = addr;
head->line = line;
memcpy(head->name, name, patch_len);
head->name[patch_len] = '\0';
head->next = NULL;
return head;
}
m = head;
while(m->next != NULL)
{
m = m->next;
}
n = (struct record*)malloc(sizeof(struct record));
n->addr = addr;
n->line = line;
memcpy(n->name, name, patch_len);
n->name[patch_len] = '\0';
n->next = NULL;
m->next = n;
m = n;
return head;
}
int delete_record(struct record *head, unsigned int addr)
{
struct record *m = NULL;
struct record *n = NULL;
if(head == NULL)
{
printf("warning: have been freed before!!");
}
m = n = head;
if(head->next == NULL)
{
if(n->addr == addr)
{
free(head);
record_list = head = NULL;
}
return 1;
}
n = m->next;
while(n != NULL)
{
if(n->addr == addr)
{
m->next = n->next;
free(n);
return 1;
}
m = m->next;
n = n->next;
}
return 1;
}
void * malloc_ext(size_t size,const char *name,unsigned int line)
{
void *p = NULL;
p = malloc(size);
if(p != NULL)
{
record_list = add_record(record_list, (unsigned int)p, line, name);
}
return p;
}
void free_ext(void * p,const char *name, unsigned int line)
{
if (p == NULL)
{
printf("can\'t free a null pointer\n");
return;
}
delete_record(record_list, (unsigned int)p);
free(p);
}
/*根据各自的系统打印未释放内存链表内容,或者写入文件*/
void show_record(void)
{
struct record *p = NULL;
struct record *head = NULL;
int i = 0;
head = record_list;
if(head == NULL)
{
printf("list is enpty!\n");
return;
}
p = head;
printf("memory list without free:\n");
while(p != NULL)
{
printf("<%s,%u>Node is:%d ,addr = 0x%x\n",p->name,p->line,++i,p->addr);
p = p->next;
}
}
char *getmem(char *string,int len)
{
char *buf = NULL;
//malloc_stats();
buf = Malloc(len);
memset(buf , 0 ,len);
snprintf(buf,len,"%s",string);
Free(buf);
//malloc_stats();
return buf;
}
int main(int argc ,char *argv[])
{
int i = 0;
char welcome[64] = "hello,world!";
printf("test malloc start:\n");
for(i = 0;i<10;i++)
{
getmem(welcome,sizeof(welcome));
}
show_record();
printf("test over.\n");
return;
}
内存泄漏之malloc替换方法的更多相关文章
- MFC多线程内存泄漏问题&解决方法
在用visual studio进行界面编程时(如MFC),前台UI我们能够通过MFC的消息循环机制实现.而对于后台的数据处理.我们可能会用到多线程来处理. 那么对于大多数人(尤其是我这样的菜鸟),一个 ...
- 上Mysql com.mysql.jdbc.StatementImpl$CancelTask内存泄漏问题和解决方法
近来在负责公司短信网关的维护及建设,随着公司业务发展对短信依赖越来越严重了,短信每天发送量也比曾经每天40多w发送量暴增到每天达到200w发送量.由于是採用Java做发送底层,压力递增情况下不可避免的 ...
- Android 内存泄漏分析与解决方法
在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...
- android 内存泄漏,以及检测方法
1.为什么会产生内存泄漏 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. 2.内 ...
- android中常见的内存泄漏和解决的方法
android中的内存溢出预计大多数人在写代码的时候都出现过,事实上突然认为工作一年和工作三年的差别是什么呢.事实上干的工作或许都一样,产品汪看到的结果也都一样,那差别就是速度和质量了. 写在前面的一 ...
- 使用HandyJSON导致的内存泄漏问题相关解决方法
在移动开发中,与服务器打交道是不可避免的,从服务器拿到的接口数据最终都会被我们解析成模型,现在比较常见的数据传输格式是json格式,对json格式的解析可以使用原生的解析方式,也可以使用第三方的,我们 ...
- 利用Java剖析工具JProfiler查找内存泄漏的方法
本文主要介绍如何如何利用在使用JProfiler时意识到内存泄漏以及查找内存泄漏的几种方法. 工具/原料 JProfiler 方法/步骤 JProfiler的内存视图会话提供了内存使用情况的动 ...
- Android - 内存泄漏的情况以及解决方法
[译]Android内存泄漏的八种可能(上) Android防止内存泄漏的八种方法(下). Static Activities 在类中定义了静态Activity变量,把当前运行的Activity实例赋 ...
- VC使用CRT调试功能来检测内存泄漏
信息来源:csdn C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话.在 C/C+ ...
随机推荐
- Flutter布局2--Align
Align控件即对齐控件,能将子控件所指定方式对齐,并根据子控件的大小调整自己的大小. eg: 文字组件对齐于右下方 new Align( alignment: FractionalOffset.bo ...
- learning express step(四)
learning express route function const express = require('express'); const app = express(); app.get(' ...
- bzoj 1924
所用点的编号为输入顺序,因为只有在存在联通门的宫室中存在宝藏.其余点不考虑 对于每一行,选定一个横天门,向该行横天门连双向边,其余门单向边纵列同理自.由门用map判周围八个点是否存在,存在即连边 Ta ...
- c标签forEach
<c:forEach items="${requestScope.getUserMenuModelList}" var="item" varStatus= ...
- Django中常用的基本命令
django-admin startproject 项目的名称 创建一个项目 python manage.py startapp 应用的名称 创建一个应用 python manage.py ru ...
- 设置Python打印格式
>>> def esc(code): ... return f'\033[{code}m' ... >>> print(esc('31;1;4') + 'reall ...
- 生成要发送到社区的内核补丁时如何指定发布的版本号(v2,v3...)?
1. 生成一个补丁 git format-patch --subject-prefix=v2 -1 那么生成的patch文件就会有如下类似的信息: Subject: [v2] your descrip ...
- python 学生表
1,主页面函数(01-mainpage.py) import json import file_manager import student_system ''' ''' # 全局变量 file_na ...
- ZXHN H218N 超级管理员账号
telecomadmin nE7jA%5m cmcc空格cmcc空格cmccaDm8H%MdA
- C++ remove remove_if erase
#include <iostream>#include <algorithm>#include <list>#include <vector>#incl ...