Chinaunix首页 | 论坛 | 博客
  • 博客访问: 52874
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 10:18
文章分类

全部博文(18)

文章存档

2011年(1)

2010年(14)

2009年(3)

我的朋友
最近访客

分类:

2010-06-01 23:52:47

翻译自官网,()以供学习


内存管理
ClanLib 支持多种内存管理接口。它们可以粗略的分为两类。
1.跟踪分配或释放对象
2.内存分配

ClanLib 有两个内存管理类;CL_DataBuffer 和 CL_SharedPtr.
CL_DataBuffer 用来帮助分配内存,并且当内存引用消失时释放内存。一个简单的用例是当我们从后台的处理程序中恢复作业信息:
DWORD size_required = 0;
GetJob(printer, job_id, 2, 0, 0, &size_required);
CL_DataBuffer buffer(size_required);
GetJob(printer, job_id, 2, buffer.get_data(), buffer.get_size(), &size_required);
JOB_INFO_2 *job_info = (JOB_INFO_2 *) buffer.get_data();
CL_Console::write_line("Document was printed by %1", job_info->pUserName);

使用data buffer 这个类的主要目的是它保证无论JOB_INFO_2 使用什么路径都会释放内存,包括异常抛出

CL_SharedPtr 模板是一个改良的指针。它的功能和data buffer一样,只是使用了c++模板使它看起来更像一个正常的指针。一个简单的例子:
class MyClass
{
public:
    int a;
    void test() { }
};

CL_SharedPtr ptr(new MyClass);
ptr->a = 314;
ptr->test();

再次重申,当指针的所有引用取消后,MyClass的实例也将被删除

ClanLib 的共享指针模板使用了很多技巧以避免堆分配并且当引用为0时允许你进行微调。上面的例子中,惟一的堆分配是'new MyClass'.下面是一个更高级的例子来说明当释放一个类时在哪里使用回调函数。
class MyOtherClass
{
public:
    void free_myclass(MyClass *ptr)
    {
        delete ptr;
    }
};

MyOtherClass other_class;
CL_SharedPtr ptr(
    new MyClass,
    &other_class, MyOtherClass::free_myclass);
ptr->a = 314;

我们也可以使用内存分配接口来分配内存。下面的例子我们将给内存池分配16Kb:
CL_FixedMemoryPool<16*1024> memory_pool;
CL_SharedPtr ptr(cl_new(&memory_pool) MyClass, &memory_pool));
ptr->a = 314;

管好你的内存使它在你的内存中能够大量的改善分配性能,尤其是在多线程环境中。
在CL_SharedPtr中不支持循环引用;例如,对象A指向B并且B有一个指针指向A。可以通过使用CL_WeakPtr模板类解决这个问题:
class A
{
public:
    CL_SharedPtr b;
};
class B
{
public:
    CL_WeakPtr a;
};

CL_SharedPtr
a(new A);
a->b = CL_SharedPtr(new B);
a->b->a = a;

当A的引用都消失时,B将被释放,但B的引用消息,A并不会被释放。
最后一个CL_SharedPtr允许你将CL_SharedPtr对象赋给非模板类CL_UnknowPtr。你可以在之后将对象转换回CL_SharedPtr。如果赋值对象的CL_SharedPtr类型不匹配,指针将被赋值为null.

CL_SharedPtr
a(new A);
CL_SharedPtr b;
CL_SharedPtr
c;
CL_UnknownPtr unknown = a;
b = unknown; // b.is_null() returns true
c = unknown; // c now points at a


Allocators

ClanLib 替换了传统的操作符new, delete 和 delete[]:
cl_new(pool) ClassName
cl_delete(pool) ptr
cl_delete_array(pool) ptr

这些替代方式将使用CL_MemoryPool对象传递,并分配和释放指定的内存,它们用来代替編译器自动产生的堆分配。它将使应用程序更方便的调整内存;一个应用程序可以使用不同的内存池用来管理临时内存的分配或者长时间使用的内存分配,甚至可以在每个线程中使用不同的内存池。
阅读(579) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~