首页 > 其他 > 详细

自我实现内存管理

时间:2016-03-14 02:02:23      阅读:232      评论:0      收藏:0      [点我收藏+]

在我们使用内存的时候,偶尔会由于疏忽而忘记释放掉已用完的内存,从而引起内存泄露,因此可以写一个内存管理的程序,用来检查那些内存泄露,在什么位置,从而能使程序更高效。

代码如下:

#pragma once              //头文件
#include <iostream>
using namespace std;
#include <string>
#include <list>
#include <assert.h>
struct BlockInfo
{
 void* _ptr;
 string _file;
 int _line;
 BlockInfo(void* ptr, const char* file, int line)
  :_ptr(ptr)
  ,_file(file)
  ,_line(line)
 {}
};

void* Alloc(size_t size, const char* file, int line);
void Dealloc(void* ptr);
void Print();

template<class T>
T* __NEW(size_t size,const char* file,int line)
{
 T* ptr = (T*)Alloc(size,file,line);
 return new(ptr) T;
}
template<class T>
void __DELETE(T* ptr)
{
 ptr->~T();
 Dealloc(ptr);
}
#define NEW(type)  __NEW<type>(sizeof(type),__FILE__,__LINE__)
#define DELETE(ptr)  __DELETE(ptr)
#define NEW_ARRAY(type,num)  __NEW_ARRAY<type>(sizeof(type)*num+4,__FILE__,__LINE__)
#define DELETE_ARRAY(ptr)  __DELETE_ARRAY(ptr);
template<class T>
T* __NEW_ARRAY(size_t size,const char* file,int line)
{
 T* ptr = (T*)Alloc(size,file,line);
 int num = (size-4)/sizeof(T);
 *((int*)ptr) = num;
 int i = 0;
 T* tmp = (T*)(((int*)ptr)+1);
 while(i < num)
 {
  new(tmp) T;
  ++i;
  ++tmp;
 }
 return (T*)(((int*)ptr)+1);
}
template<class T>
void __DELETE_ARRAY(T* ptr)
{
 int num = *(((int*)ptr)-1);
 T* tmp = (T*)ptr;
 while(num)
 {
  tmp->~T();
  --num;
  ++tmp;
 }
 Dealloc((int*)ptr-1);
}
#include "MemoryManager.h"                   //.cpp文件
list<BlockInfo> BlockList;
void* Alloc(size_t size, const char* file, int line)
{
 void* ptr = malloc(size);
 if(ptr != NULL)
 {
  BlockInfo info(ptr,file,line);
  BlockList.push_back(info);
 }
 return ptr;
}
void Dealloc(void* ptr)
{
 free(ptr);
 if(ptr != NULL)
 {
  list<BlockInfo>::iterator it = BlockList.begin();
  while(it != BlockList.end())
  {
   if(it->_ptr == ptr)
   {
    BlockList.erase(it);
    return;
   }
   ++it;
  }
  assert(false);
 }
}
void Print()
{
 cout<<"内存泄露的内存块:"<<endl;
 list<BlockInfo>::iterator it = BlockList.begin();
 while(it != BlockList.end())
 {
  printf("ptr:%p\tfile:%s\tline:%d\n",it->_ptr,it->_file.c_str(),it->_line);
  ++it;
 }
}


本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1750625

自我实现内存管理

原文:http://2627lounuo.blog.51cto.com/10696599/1750625

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!