让我们一起来实现一个完整的内存管理工具(线程,内存池,萃取)

//让我们开始一个完整的内存管理工具的实现吧。
///准备做一个完整的内存管理工具
//涉及线程,内存池,萃取,不仅仅是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;
}
时间: 2024-11-08 19:15:52

让我们一起来实现一个完整的内存管理工具(线程,内存池,萃取)的相关文章

分享一个web应用程序池管理工具

因为项目在联调阶段由于各种各样的原因需要重启应用程序池,而调试服务器基本都需要远登操作.同样的情况也会发生在线上,如果公司权限控制得比较严格,每次都要多部门的服务器权限申请的话有点麻烦, 所以抽点时间取巧做了个web版的管理工具(根据自己公司的企业文化酌情考虑是否线上应用). 功能:兼容iis6和iis7.提供文件操作,线程池操作以及站点操作.友情提示一下,如果你需要部署在线上环境,但是线上开放的端口都已经被占用的话,你可以将此程序挂靠在某个站点,创建成子应用和虚拟目录同样的层次操作. 图: 如

阿庆SQL智能查询分析器,使用delphi开发的一个数据库查询分析管理工具.分享给大家

为方便自己工作,使用delphi开发的一个数据库查询分析管理工具.分享给大家,具体以下特点: 1.由于使用ADO连接,理论支持SQL Server.Access.MySQL.Oracle等所有数据库 2.支持SQL关键词自动提示 3.支持表名自动提示 4.支持表字段自动提示 5.支持SQ关键词.表名.表字段不同颜色显示 6.支持SQL语句注释(包括ACCESS) 7.支持选择部分文字执行SQL语句 8.查询结果支持增加.修改.编辑 9.绿色程序无附加文件,只有一个文件即可运行,文件大小只有400

让我们一起来实现一个内存管理工具第二章(类型,cookie信息,构造,数组)

#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()&quo

Bower —— 一个Web的包管理工具

作者:江剑锋 github地址:https://github.com/bower/bower Bower为何物 Bower是一个Web开发的包管理软件.前端开发中,或多或少,都会以来于现成的framework或者lib,如bootstrap.jquery等.每次编写代码之前,都需要从网上下载,或者从硬盘深处找出珍藏的,项目所依赖的框架或者库文件.同时,所下载的文件,又可能以来与另外的库文件.Bower的诞生,正是为了解决此繁琐的以来关系的. 需要注意的是,Bower的运行,依赖于版本控制工具gi

Python Django 编写一个简易的后台管理工具1-安装环境

安装python环境 MAC 一般都会自带 Python2.x版本 的环境,你也可以在链接 https://www.python.org/downloads/mac-osx/ 上下载最新版安装. 安装pip工具 Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具. pip 官网:https://pypi.org/project/pip/ 你可以通过以下命令来判断是否已安装: pip --version 安装django 使用前一步已经安装的pip工具进行安装,

Python Django 编写一个简易的后台管理工具2-创建项目

django-admin 创建项目 pycharm 创建项目 原文地址:https://www.cnblogs.com/xiaomingtx/p/11378155.html

【如何快速的开发一个完整的iOS直播app】(原理篇)

一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术,每一个技术都够你学几年的. 直播易:已经有各个领域的大牛,封装好了许多牛逼的框架,我们只需要用别人写好的框架,就能快速的搭建一个直播app,也就是传说中的站在大牛肩膀上编程. 二.了解直播 热门直播产品 映客,斗鱼,熊猫,虎牙,花椒等等 直播效果图 直播效果.jpeg 1.一个完整直播ap

【如何快速的开发一个完整的iOS直播app】(播放篇)

前言 在看这篇之前,如果您还不了解直播原理,请查看上篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,集成ijkplayer成功后,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦 本篇主要讲解的是直播app中,需要用到的一个很重要的开源框架ijkplayer,然后集成这个框架可能对大多数初学者还是比较有难度的,所以本篇主要教你解决集成[ijkplayer]遇见的各种坑. 很多文章,可能讲解的是如何做,我比较注重讲解为什么这样做,大家有什么不明白,还可以

【转载】串口中怎样接收一个完整数据包的解析

这里以串口作为传输媒介,介绍下怎样来发送接收一个完整的数据包.过程涉及到封包与解包.设计一个良好的包传输机制很有利于数据传输的稳定性以及正确性.串口只是一种传输媒介,这种包机制同时也可以用于SPI,I2C的总线下的数据传输.在单片机通信系统(多机通信以及PC与单片机通信)中,是很常见的问题. 一.根据帧头帧尾或者帧长检测一个数据帧 1.帧头+数据+校验+帧尾 这是一个典型的方案,但是对帧头与帧尾在设计的时候都要注意,也就是说帧头.帧尾不能在所传输的数据域中出现,一旦出现可能就被误判.如果用中断来