C++实现一个完整的内存管理工具(线程,内存池,萃取)

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
//让我们开始一个完整的内存管理工具的实现吧。
///准备做一个完整的内存管理工具
//涉及线程,内存池,萃取,不仅仅是new跟delete的重载(或者说是函数重载),这是我的一个雏形,大家谁有什么好的指正谢谢提出,一起学习。
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <list>
#include <malloc.h>
using namespace std;
class String
{   public:
    String():ptr(new char[1])
    {
        cout<<"String()"<<endl;
        ptr[0]='\0';
    }
    ~String()
    {
        if(ptr){
        delete ptr;
        ptr = NULL;
        }
    }
    String(const char *p):ptr(new char[strlen(p)+1])
    {
        strcpy(ptr,p);
    }

    void Printf()
    {
        cout<<"liuhuiyan"<<endl;
        cout<<ptr<<endl;
    }
    String(const String& s):ptr(new char[strlen(s.ptr)+1])
    {
        strcpy(ptr,s.ptr);
    }
    String& operator = (const String &s)
    {
        if(this!=&s)
        {
            if(ptr)delete []ptr;
            ptr = (char *)malloc(strlen(s.ptr)+1);
            strcpy(ptr,s.ptr);
        }
    }
    char& operator [](int size)
    {
        return ptr[size];
    }
  private:
char *ptr;
};
///测试类

struct Node
{
    void *_P;
    size_t _Line;
    char *_Filename;
    size_t _Size;
    Node(void *q = NULL,size_t len = size_t(),\
    const char *name="",int d=int()):_P(q),\
    _Line(len),_Filename(new char[strlen(name)+1]),_Size(d)
    {   
        strcpy(_Filename,name);
    }
};

#define ALLOC(size,type)  (_ALLOC(size,__FILE__,__LINE__,type()))
//type是传进来的一个类型,
list<Node> mlist;//调用stl的一个链表保存.

ostream& operator <<(ostream& os,const Node &node)//重载内存泄漏输出信息。
{
    cout<<node._P<<endl;
    cout<<node._Line<<endl;
    cout<<node._Filename<<endl;
    cout<<node._Size<<endl; 
}
///////////////////////////////////////////////
struct _false{};
struct _true{};//萃取.
template<typename type>//范化
class triast
{
    public:
        typedef  _false _ISPOD_ ;   
};
template<>
class triast<int>//特化
{
    public:
    typedef _true _ISPOD_;
};
template<>//特化。
class triast<char>
{
    public:
    typedef _true _ISPOD_;
};
//////////////////////////////////////////
//相当与STL里面的萃取,别急,这只是我的一个雏形。

template<typename type>
class Traist
{
    public:
    typedef type _type_;
};

template<typename type>
static void traits(type &val)
{
    typedef typename Traist<type> :: _type_ _TYPE_;
    *val="123";
    val->Printf();
}//类型萃取,我的目的是当我传入参数的时候,不需要传递它的类型。。
/////////////////////////////////////////////////
template<typename type>
static void* _ALLOC(int size,const char *_file_,int _line_,_true,type s1)
{           //不需要调用构造函数的赖皮空间的方式如int *,char * 
        void *p = malloc(size);
        Node node(p,size,_file_,_line_);
        mlist.push_back(node);
        return p;       
}
template<typename type>
static void* _ALLOC(int size,const char *_file_,int _line_,_false,type s1)
{
        //需要调用构造函数的靠皮空间的方式如:String s();
        void *p = malloc(size);
        Node node(p,size,_file_,_line_);
        mlist.push_back(node);
        new(p)type();
        return p;
}

template<typename type>
static void* _ALLOC(int size,const char *_file_,int _line_,type s1)
{
    typedef typename triast<type> :: _ISPOD_ ispod; 
    _ALLOC(size,_file_,_line_,ispod(),s1);
}

static void Printf()
{
        list<Node> :: iterator it;
        it = mlist.begin();
        while(it!=mlist.end())
        {
            cout<<*it<<"\t";
            ++it;
        }
}

static void DELETE(void *p)//这里就需要类型萃取,自动判别P的类型,看是否需要调用构造函数。
{
    list<Node>::iterator it;
    it = mlist.begin();
    while(1)
    {
        if(it->_P==p){
            mlist.erase(it);
            break;
            }
        it++;
    }
}

int main()
{
    String *s = (String *)ALLOC(sizeof(String),String);
//int *a = (int *)ALLOC(sizeof(int),int);
//  DELETE(a);
//  Printf();
    traits(s);//萃取测试.
    return 0;
}

标签: isp

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:C语言递归算法求某一数在数组中出现的次数

下一篇:Linux环境下C语言实现贪吃蛇游戏