WEB开发网
开发学院软件开发C++ C++内存管理变革(2):最袖珍的垃圾回收器 阅读

C++内存管理变革(2):最袖珍的垃圾回收器

 2010-10-15 09:07:47 来源:Web开发网   
核心提示:规格我们将该垃圾回收器命名为AutoFreeAlloc,它的接口很简单,C++内存管理变革(2):最袖珍的垃圾回收器(2),仅涉及两个概念:Alloc、Clear,typedef void (*FnDestructor)(void* pThis);class AutoFreeAlloc{public:~AutoFree

规格

我们将该垃圾回收器命名为AutoFreeAlloc。它的接口很简单,仅涉及两个概念:Alloc、Clear。

typedef void (*FnDestructor)(void* pThis);

class AutoFreeAlloc
{
public:
~AutoFreeAlloc(); // 析构函数。自动调用Clear释放内存
void* Alloc(size_t cb); // 类似于malloc(cb)
void* Alloc(size_t cb, FnDestructor fn); // 申请内存并指定析构函数
void Clear(); // 析构并释放所有分配的对象
};

为了方便,提供辅助的New操作(上一篇中已经简单介绍实现了),大体如下:

template <class Type, class AllocType>
Type* New(AllocType& alloc); // 类似于new Type

template <class Type, class ArgType1, class AllocType>
Type* New(ArgType1 arg1, AllocType& alloc); // 类似于new Type(arg1)

template <class Type, class AllocType>
Type* NewArray(size_t count, AllocType& alloc);// 类似于new Type[count]

使用样例:

AutoFreeAlloc alloc;

int* intArray = (int*)alloc.Alloc(sizeof(int)*count);
int* intArray2 = NewArray<int>(count, alloc);

* obj = New<MyClass>(alloc);
MyClass* objWithArg = New<MyClass>(arg1, alloc);
MyClass* objArray = NewArray<MyClass>(count, alloc);

// …
// 现在,不能再访问intArray, obj, objWithArg, objArray等数据了。

内存管理机制

class AutoFreeAlloc
{
public:
enum { BlockSize = 2048 };
private:
struct _MemBlock
{
_MemBlock* pPrev;
char buffer[BlockSize];
};
enum { HeaderSize = sizeof(_MemBlock) - BlockSize };

char* m_begin;
char* m_end;
};

AutoFreeAlloc类与内存管理相关的变量只有两个:m_begin、m_end。单从变量定义来看,基本上很难看明白。但是有了下面这张示意图就容易理解多了:

图 2

上一页  1 2 3 4 5 6  下一页

Tags:内存 管理 变革

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接