下面是编程之家 jb51.cc 通过网络收集整理的代码片段。
编程之家小编现在分享给大家,也给大家做个参考。
//让我们开始一个完整的内存管理工具的实现吧。
///准备做一个完整的内存管理工具
//涉及线程,内存池,萃取,不仅仅是new跟delete的重载(或者说是函数重载),这是我的一个雏形,大家谁有什么好的指正谢谢提出,一起学习。
#include
#include
#include
#include
#include
#include
using namespace std;
class String
{ public:
String():ptr(new char[1])
{
cout<
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<
cout<
}
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 mlist;//调用stl的一个链表保存.
ostream& operator <
{
cout<
cout<
cout<
cout<
}
///
struct _false{};
struct _true{};//萃取.
template//范化
class triast
{
public:
typedef _false _ISPOD_ ;
};
template<>
class triast//特化
{
public:
typedef _true _ISPOD_;
};
template<>//特化。
class triast
{
public:
typedef _true _ISPOD_;
};
//
//相当与STL里面的萃取,别急,这只是我的一个雏形。
template
class Traist
{
public:
typedef type _type_;
};
template
static void traits(type &val)
{
typedef typename Traist :: _type_ _TYPE_;
*val="123";
val->Printf();
}//类型萃取,我的目的是当我传入参数的时候,不需要传递它的类型。。
/
template
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
static void* _ALLOC(int size,_false,type s1)
{
//需要调用构造函数的靠皮空间的方式如:String s();
void *p = malloc(size);
Node node(p,_line_);
mlist.push_back(node);
new(p)type();
return p;
}
template
static void* _ALLOC(int size,type s1)
{
typedef typename triast :: _ISPOD_ ispod;
_ALLOC(size,_line_,ispod(),s1);
}
static void Printf()
{
list :: iterator it;
it = mlist.begin();
while(it!=mlist.end())
{
cout<
++it;
}
}
static void DELETE(void *p)//这里就需要类型萃取,自动判别P的类型,看是否需要调用构造函数。
{
list::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;
}
以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!