内存泄漏+适配器+多态

//#pragma once
//#include<iostream>
//#include<string>
//Singleton.hpp
//#include<list>
//#include<assert.h>
//#include<stdarg.h>
//using namespace std;
//struct BlockInfo
//{
//	void* _ptr;
//	string _file;
//	int _line;
//	BlockInfo(void *ptr, const char*file, int line)
//		:_ptr(ptr)
//		, _file(file)
//		, _line(line)
//	{}
//};
//class SaveAdapter//适配器
//{
//public:
//	//可变参数列表
//	//纯虚函数,抽象类,不能实例化出对象,继承的类应该重写此虚函数
//	virtual void Save(const char* fmt, ...) = 0;
//};
//class ConsoleSaveAdapter :public SaveAdapter
//{
//public:
//	//显示在控制台,同理还可记入数据库中
//	void Save(const char* fmt, ...)
//	{
//		va_list args;
//		va_start(args, fmt);
//		vfprintf(stdout, fmt, args);
//		va_end(args);
//	}
//};
//class  FileSaveAdapter :public SaveAdapter
//{
//public:
//	FileSaveAdapter(const char* filename = "Memory.txt")
//	{
//		_fOut = fopen(filename, "w");
//	}
//	//记录在文件
//	void Save(const char* fmt, ...)
//	{
//		va_list args;
//		va_start(args, fmt);
//		vfprintf(_fOut, fmt, args);
//		va_end(args);
//	}
//	~FileSaveAdapter()
//	{
//		fclose(_fOut);
//	}
//protected:
//	FILE* _fOut;
//};
////单例模式
//class Singleton
//{
//public:
//	static Singleton* GetInstance()
//	{
//		if (sInstance == NULL)
//		{
//			sInstance = new Singleton;
//		}
//		return sInstance;
//	}
//	void *Alloc(size_t size, const char* file, int line)
//	{
//		void* ptr = malloc(size);
//		if (ptr)
//		{
//			BlockInfo  b(ptr, file, line);
//			GetInstance()->BlockList.push_back(b);
//		}
//		return ptr;
//	}
//	void Dalloc(void *ptr)
//	{
//		free(ptr);
//		//[)
//		list<BlockInfo>::iterator it = GetInstance()->BlockList.begin();
//		while (it != GetInstance()->BlockList.end())
//		{
//			if (it->_ptr == ptr)
//			{
//				GetInstance()->BlockList.erase(it);
//				return;
//			}
//			++it;
//		}
//		assert(false);
//	}
//	//静态成员函数没有this指针
//	//静态函数里面不能调用非静态函数,没有this指针传过去
//	static void Print()
//	{
//		cout << "内存泄漏的内存块" << endl;
//		list<BlockInfo>::iterator it = GetInstance()->BlockList.begin();
//		while (it != GetInstance()->BlockList.end())
//		{
//			printf("ptr:%p file:%s line:%d\n", it->_ptr, it->_file.c_str(), it->_line);
//			++it;
//		}
//	}
//	void Persistent()
//	{
//		ConsoleSaveAdapter  csa;
//		Singleton::GetInstance()->_Persistent(&csa);
//		FileSaveAdapter  fsa;
//		Singleton::GetInstance()->_Persistent(&fsa);
//	}
//private:
//	void  _Persistent(SaveAdapter* sa)//单例模式此时应传父类指针或引用
//	{
//		std::list<BlockInfo>::iterator it = GetInstance()->BlockList.begin();
//		while (it != GetInstance()->BlockList.end())
//		{
//			sa->Save("ptr:%p, file:%s, line:%d\n", it->_ptr, it->_file.c_str(), it->_line);//运用的是多态
//			++it;
//		}
//	}
//	Singleton()
//	{}
//	Singleton(const Singleton& s);
//	Singleton& operator=(const Singleton& s);
//protected:
//	static Singleton* sInstance;
//	list<BlockInfo> BlockList;
//};
//template<class T>
//T *__NEW(size_t num, const char* file, int line)
//{
//	T *ptr = (T*)(Singleton::GetInstance()->Alloc(sizeof(T)*num, file, line));
//	if (TypeTraits <T>::__IsPODType().Get())
//		return ptr;
//	else
//		return new(ptr)T;
//}
//template<class T>
//void __DELETE(T *ptr)
//{
//	if (!TypeTraits <T>::__IsPODType().Get())
//		ptr->~T();
//	Singleton::GetInstance()->Dalloc(ptr);
//}
//template<class T>
//T *__NEW_ARRAY(size_t num, const char* file, int line)
//{
//	size_t size = sizeof(T)*num;
//	T* ptr = NULL;
//	if (TypeTraits <T>::__IsPODType().Get())
//	{
//		ptr = (T*)(Singleton::GetInstance()->Alloc(size, file, line));
//		return ptr;
//	}
//	else
//	{
//		size += 4;
//		ptr = (T*)(Singleton::GetInstance()->Alloc(size, file, line));
//		*((int*)ptr) = num;
//		T* cur = (T*)((int*)ptr + 1);
//		for (size_t i = 0; i < num; i++)
//		{
//			new(&cur[i])T;//如果是基本类型则不执行,直接跳过
//		}
//		return cur;
//	}
//
//}
//template<class T>
//void __DELETE_ARRAY(T* ptr)
//{
//	if (TypeTraits <T>::__IsPODType().Get())
//	{
//		Singleton::GetInstance()->Dalloc(ptr);
//	}
//	else
//	{
//		int num = *((int*)ptr - 1);
//		for (int i = 0; i < num; i++)
//		{
//			ptr[i].~T();
//		}
//		Singleton::GetInstance()->Dalloc((void*)((int*)ptr - 1));
//	}
//
//}
//struct __TrueType
//{
//	bool Get()
//	{
//		return true;
//	}
//};
//
//struct __FalseType
//{
//	bool Get()
//	{
//		return false;
//	}
//};
//
//template <class _Tp>
//struct TypeTraits
//{
//	typedef __FalseType   __IsPODType;
//};
//
//template <>
//struct TypeTraits< bool>
//{
//	typedef __TrueType     __IsPODType;
//};
//
//template <>
//struct TypeTraits< char>
//{
//	typedef __TrueType     __IsPODType;
//};
//template <>
//struct TypeTraits< int>
//{
//	typedef __TrueType     __IsPODType;
//};
//
//#define NEW(type) __NEW<type>(1,__FILE__,__LINE__)
//#define DELETE(ptr) __DELETE(ptr)
//#define NEW_ARRAY(type,num)  __NEW_ARRAY<type>(num,__FILE__,__LINE__)
//#define DELETE_ARRAY(ptr)  __DELETE_ARRAY(ptr)//模板类型根据传过去参数自己推演类型 
//Singleton* Singleton::sInstance = NULL;

////测试用例
//#include<iostream>
//using namespace std;
//#include"Singleton.hpp"
////自定义类型数组
//void Test4()
//{
//	string*  p1 =NEW_ARRAY(string, 5);
//	p1[0] = "abc";
//	p1[1] = "def";
//	p1[2] = "xxx";
//	p1[3] = "lll";
//	p1[4] = "www";
//	cout << p1->c_str() << endl;
//	DELETE_ARRAY(p1);
//}
//int main()
//{
//	Test4();
//	//登记一个函数在main函数执行结束以后执行,函数限制void Func(void)
//	Singleton::GetInstance()->Persistent();
//	atexit(Singleton::Print);
//	system("pause");
//	return 0;
//}
时间: 2024-08-09 19:49:52

内存泄漏+适配器+多态的相关文章

Java会造成内存泄漏,多态,垃圾回收,clone

会,比如一个足够大的整数减去一个足够大的负数,结果就会造成溢出.导致内存泄漏. Java实现多态的机制是什么? 方法名称相同,方法的参数个数或者类型不相同.Java进行垃圾回收主要是对动态内存进行垃圾回收,一般是当内存不够用的时候进行垃圾回收,或者通过system.gc()来通知系统进行垃圾回收.但是不一定保证执行. 静态变量只能是静态方法才能去调用他. super.clone(),这是clone()方法的默认行为,因为首先要把父类中的成员复制之后,然后才能复制自己的成员. Java语言的一个优

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

linux中内存泄漏的检测(四)记录泄漏的大小

<linux中内存泄漏的检测(三)定制化的new/delete>讲到,利用C++的函数重载的特性,使C++的代码,也能方便地为new/delete加上用于检测内存泄漏的统计代码.然而,也因此引入的新的问题. 目前的统计方式仅仅统计申请/释放内存的次数,并没有统计每次申请/释放内存的大小. 这种方法对于C来说是够用了,因为在C中申请和释放的大小是相同的,而在C++中就不一定了. 考虑以下两种情况: (1)申请了子类的空间却只释放了父类的空间 father *pF = new son; delet

Android 内存泄漏优化汇总

android内存泄漏优化摘要 博客分类: android android内存溢出OutOfMemoryError . android移动应用程序的内存分配一般是8凯瑟琳约,不正确地假定处理内存处理非常easy创建OutOfMemoryError.我们的产品是最常见的错误是OutOfMemoryError的异常, 在解决这个异常时在网上发现非常多关于OutOfMemoryError的原因的介绍. OutOfMemoryError主要由下面几种情况造成: 1.数据库的cursor没有关闭. 操作S

检查内存泄漏

1.分配空间 2.记录内存块信息 3.调用构造函数(类型萃取) #include<iostream> #include<string> #include<list> #include<assert.h> using namespace std; struct BlockInfo { void* _ptr; string _file; int _line; BlockInfo(void *ptr, const char*file, int line) :_pt

内存泄漏工具VLD1.0_要点分析

0X01 关闭FPO优化 // Frame pointer omission (FPO) optimization should be turned off for this // entire file. The release VLD libs don't include FPO debug information, so FPO // optimization will interfere with stack walking. #pragma optimize ("y", of

内存泄漏-Node

内存泄漏: 1.缓存 2.队列消费不及时 3.作用域未释放 缓存: 必须要有过期策略 1.缓存限制策略 limitablemap LRU 2.缓存解决方案 进程自身不存储状态,进程外缓存 1)能减少常驻内存的对象的数量,让垃圾回收更高效 2)进程之间可以共享缓存 常用的缓存: Redis Memcached 内存泄漏-Node,布布扣,bubuko.com

只运行一个实例以及内存泄漏检测

unit 使应用程序只运行一个实例; interface uses Windows; const  // - 互斥体唯一的名字  _Mutex_Name = '{19631971-1976-1981-1989-199319941995}'; var  _Mutex_Handle: THandle; implementation initialization // - 载入时调用的代码 // - 创建互斥体对象_Mutex_Handle := CreateMutex(nil, False, LPC

SGI STL内存配置器存在内存泄漏吗?

阅读了SGI的源码后对STL很是膜拜,很高质量的源码,从中学到了很多.温故而知新!下文中所有STL如无特殊说明均指SGI版本实现. STL 内存配置器 STL对内存管理最核心部分我觉得是其将C++对象创建过程分解为构造.析构和内存分配.释放两类操作分离开来!摆脱了对频繁调用new或malloc函数想操作系统申请空间而造成的低效.其中析构操作时对具有non-trival.trival 析构函数的class区别对待也提高了效率.SGI 的两级配置器结构属于锦上添花. STL内存配置器有没有内存泄漏?