Talloc内存池使用教程——(2)过继一个talloc context

来源:互联网 发布:mac无法解压zip 编辑:程序博客网 时间:2024/06/05 08:36

Talloc内存池使用教程——(2)过继一个talloc context

过继一个talloc context

Talloc拥有变更一个context的父节点的能力。这个操作通常被称为过继(译者注:原文为stealing,为更加易懂翻译为过继),它是最重要的talloc context操作之一。

当我们需要让一个context的生命周期比它的父节点更长时,过继context是一个必要的操作。有许多场景下会用到此功能,比如将数据库的搜索结果过继给内存中的缓存,或者将父节点从一个通用结构更改为一个具体的结构,反之亦然。最常见的场景(至少对Samba来说),是将数据从某一个函数内专用的context过继给输出context,作为输出函数的参数。

struct foo {    char *a1;    char *a2;    char *a3;};struct bar {    char *wurst;    struct foo *foo;};struct foo *foo = talloc_zero(ctx, struct foo);foo->a1 = talloc_strdup(foo, "a1");foo->a2 = talloc_strdup(foo, "a2");foo->a3 = talloc_strdup(foo, "a3");struct bar *bar = talloc_zero(NULL, struct bar);/* change parent of foo from ctx to bar */bar->foo = talloc_steal(bar, foo);/* or do the same but assign foo = NULL */bar->foo = talloc_move(bar, &foo);

talloc_move()函数与talloc_steal函数类似,不同点是它进一步将源指针设为了NULL。

一般来说,源指针自身是不会被改变的(talloc只改变了它的元数据中的父节点)。但一个常见的用法是将函数调用结果赋值给一个另外的变量,这样的话通过原来的指针访问变量应当被避免,除非必须如此。在这种情况下推荐使用talloc_move()来过继context。由于它将源指针设为NULL,这样避免了指针被意外释放,也避免了旧变量在父节点被更改的情况下被错误的使用。

这里写图片描述

0 0