Talloc内存池使用教程——(4)使用析构函数

来源:互联网 发布:mac怎样建立文件夹 编辑:程序博客网 时间:2024/06/06 19:55

Talloc内存池使用教程——(4)使用析构函数

使用析构函数

析构函数是面向对象编程的世界中广为人知的方法。一个析构函数是一个对象在销毁时自动执行的方法。它通常用来释放对象从系统中申请的资源(比如:关闭文件描述符,断开数据库连接,释放内存)。

使用talloc,即便我们在C语言中也能够受益于析构函数的好处。我们可以很容易的为一个talloc context附加上我们自己的析构函数。当context被释放时,析构函数将会自动运行。

使用talloc_set_destructor()来为talloc context附加或删除析构函数。

示例

想象我们有一个动态创建的链表。当我们释放其中的一个元素前,我们需要先确认它已经从链表中被移除了。一般来说,这需要两个先后完成的动作:将其从链表中移除,然后释放内存。使用talloc,我们可以通过设置元素的析构函数一次完成这件事,析构函数中将元素从链表中移除,talloc_free()将会完成余下的工作。

析构函数将类似这样:

int list_remove(void *ctx){    struct list_el *el = NULL;    el = talloc_get_type_abort(ctx, struct list_el);    /* remove element from the list */}

GCC3及更新版本可以在编译时检查类型。因此如果我们使用这样的编译器,我们可以使用更高级的析构函数:

int list_remove(struct list_el *el){    /* remove element from the list */}

现在我们将向元素设置析构函数。我们可以直接在插入函数中完成这件事情:

struct list_el* list_insert(TALLOC_CTX *mem_ctx,                            struct list_el *where,                            void *ptr){  struct list_el *el = talloc(mem_ctx, struct list_el);  el->data = ptr;  /* insert into list */  talloc_set_destructor(el, list_remove);  return el;}

由于talloc是一个有层级的内存分配器,我们可以进一步释放内存:

struct list_el* list_insert_free(TALLOC_CTX *mem_ctx,                                 struct list_el *where,                                 void *ptr){  struct list_el *el = NULL;  el = list_insert(mem_ctx, where, ptr);  talloc_steal(el, ptr);  return el;}
0 0
原创粉丝点击