C++内存检测(定位到确定地址,并且用hash表来保存提高了搜索效率)

#include <iostream>
#include <malloc.h>
#include <string.h>
#include <stdio.h>
#define DefaultSize 7
using namespace std;
struct Node
{
	char *pname;//文件名字
	int line;//行号
	int size;//大小
	long long save;//存储地址ip
	Node *next;
};

struct HashNode
{
  Node *adj;
	HashNode():adj(NULL){}//向量数组,保存指定向量。
};

class HashList
{
	public:
	HashList()
	{
	}
	void Insert(Node *p)
	{
		int index = Find(p->save&((long long)0x111));
		p->next=data[index].adj;
		data[index].adj=p;
	}
	int Find(int x)
	{
		return x%DefaultSize;//获取存储下标。
	}
~HashList()
	{
		Check();//进程结束时会调用析构函数,由此起到检测的作用。
	}
	void Check()
	{
		for(int i=0;i<DefaultSize;i++)
		{
			Node *p = data[i].adj;
			while(p!=NULL)
			{
				printf("start address:%p",(int*)p->save);
				//cout<<"start address :"<<std::hex<<p->save;
				cout<<"  "<<"file name:"<<p->pname<<"  "<<"line number:"<<p->line<<"  "<<"what size:"<<"  "<<p->size;
				cout<<endl;
				p=p->next;
			}
		}
	}
	void Delete(int *p)
	{
		long long a = (int)p;
	#ifdef __DEBUG__
		cout<<a<<endl;//g++ -D __DUBUG__就会在执行时默认执行到这里来并且显示a的值,不然这个开关不会打开。
	#endif
		int index = Find(a&0x111);//取最后3位的值来确定下标。
		Node *q = data[index].adj;
		Node *m = NULL;
		while(q!=NULL)
			{
//				m=q;
				if(q->save==a)
					break;
				m=q;
				q=q->next;
			}
			if(m==NULL)
			{

				data[index].adj=q->next;
				free(q);
				return;
			}
			if(q!=NULL)
			{
			m->next = q->next;
			free(q);
			}
	}
	private:
	HashNode data[DefaultSize];//向量数组,包含一个节点指针adj.
};
HashList list;
void *operator new(size_t sz,const char *pname,int line)
{
	Node *p = (Node *)malloc(sizeof(Node));
	p->pname = (char *)malloc(20);
	strcpy(p->pname,pname);
	p->size=sz;
	p->line=line;
	void *q = (void *)malloc(sz);
	p->save=(int)(q);//将地址转化为整形并且存储,在删除的时候会用到。
	list.Insert(p);
	return q;//返回的q使用。
}
void operator delete(void *p)
{
	list.Delete((int *)p);
	free(p);//这里要将p进行释放.
}
void *operator new [](size_t sz,const char* pname ,int line)
{
	Node *p = (Node *)malloc(sizeof(Node));
	p->pname = (char *)malloc(20);
	strcpy(p->pname,pname);
	p->size=sz;
	p->line=line;
	void *q = (void *)malloc(sz);
	p->save = (int)(q);
	list.Insert(p);
	return q;//反谁开辟内存大小。
}
void operator delete[](void *p)
{
	list.Delete((int *)p);
	free(p);//必须返回。
}
#define new new(__FILE__,__LINE__)//define new
int main()
{
	int *p = new int();
	int *q = new int();
	char *c = new char();
	int *p1 = new int[10];
	delete q;
	delete []p1;
	delete c;
	int *a = new int();
	return 0;
}

感想:记录内存需要占用大量的内存,虽然在定位地址时加快了速度,是一种侵入式的方法,因为你重载了new及delete,需要引入大量源文件的头部来满足重载new及delete的需求.

时间: 2024-11-02 11:14:21

C++内存检测(定位到确定地址,并且用hash表来保存提高了搜索效率)的相关文章

内存泄漏定位以及解决

1 内存泄漏定位 1.1 valgrind Valgrind包含下列工具: memcheck:检查程序中的内存问题,如泄漏.越界.非法指针等. callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能 cachegrind:分析CPU的cache命中率.丢失率,用于进行代码优化. helgrind:用于检查多线程程序的竞态条件 massif:堆栈分析器,指示程序中使用了多少堆内存等信息. 通过valgrand --tool=name 程序名来分别调用的 Memcheck:  最常用

【调试】Linux下超强内存检测工具Valgrind

[调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Linux下,开放源代码(GPLV2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成. 内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.

Android 内存泄露总结(附内存检测工具)

https://segmentfault.com/a/1190000006852540 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存. 堆区:通常存放 new 出来的对象.由 Java 垃圾回收器回收. 栈与堆的区别 栈内存用来存放局部变量和函数参数等.它是先进后出的队列,进出一一对应,不产生碎片,运行效率稳定高.当超过变量的作用域后,该变量也就无效了,分配给它

内存检测

TBOX的内存分配在调试模式下,可以检测支持内存泄露和越界,而且还能精确定位到出问题的那块内存具体分配位置,和函数调用堆栈. 内存泄露检测 内存泄露的检测必须在程序退出的前一刻,调用tb_exit()的时候,才会执行,如果有泄露,会有详细输出到终端上. tb_void_t tb_demo_leak() { tb_pointer_t data = tb_malloc0(10); } 输出: [tbox]: [error]: leak: 0x7f9d5b058908 at tb_static_fix

C/C++内存检测工具Valgrind

内存检测Valgrind简介 Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O'Reilly开源大奖的Julian Seward, 它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测, 我们可以使用它的工具:Memcheck.   Valgrind 安装 方法 1.  valgrind官网:http://valgrind.org下载 方法 2.  Ubuntu  sudo a

CPP内存检测

对C.C++的内存泄露.内存溢出等检查,经过这两天的查资料,总体来说可以使用Valgrind, AddressSanitizer, Dr.Memory等.其中Valgrind对程序运行速度影响较大,运行耗时10倍以上,如果是对Android Native代码进行检查,比较推荐对代码进行必要的修改,编译成可执行文件,在pc Linux系统上检测是否存在内存问题.Dr.Memory则比Valgrind的速度快,比较适合在Windows系统中使用.而对于Android上的使用,Google目前则大力推

Visual Leak Detector 2 2 3 Visual C++内存检测工具

Visual Leak Detector是一款免费的.健全的.开源的Visual C++内存泄露检测系统.相比Visual C++自带的内存检测机制,Visual Leak Detector可以显示导致内存泄露的完整内存分配调用堆栈. 主页地址:http://vld.codeplex.com/ 旧版地址:http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio 下载Vis

Cocos2d-x开发---关于内存检测

这几天面试的时候,面试官都会问我在游戏开发过程中是如何应对内存检测的,如何监控程序是否有内存泄漏的问题.在开发的过程中也没有认真的注意过这个问题(当然不是说不去关注程序的内存泄漏问题,而是说并没有特意到去思考如何去监控),因为上家公司使用的是xcode开发工具,其自带了性能监控的工具,平时也就是用的这个,可能没太在意这些吧. 因为面试官问这个比较多,然后我感觉自己确实需要多注意注意程序开发过程中的一些基础性问题,所以把自己所知道的整理整理. Mac上: 使用xcode进行开发,当运行模拟器或者进

内存问题定位与解决

内存问题定位基本流程: 主要用到的性能计数器 Page life expectancy (数据库计数器:主要显示不被使用的页,将在缓存中停留的秒数 ) Lazy writes/sec (数据库计数器:惰性写入器会在内存有压力且有新的内存需求时触发,成批的刷新“老化的缓冲区”) Page Reads/sec,Page Writes/sec (这里使用数据库级别计数器:当需要读取或写入的页不在内存中,需要到磁盘中读取时计数) Target Server Memory (KB)  (SQL serve