8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

cleanup属性

Last updated at Posted at 2014-09-09

systemdのソースコードを読んでいると、各所で_cleanup_free_という修飾子が使われているのが分かる。例えば、

src/core/cgroup.c
Unit *manager_get_unit_by_pid(Manager *m, pid_t pid) {
        _cleanup_free_ char *cgroup = NULL;
        int r;

        assert(m);

        if (pid <= 1)
                return NULL;

        r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &cgroup);
        if (r < 0)
                return NULL;

        return manager_get_unit_by_cgroup(m, cgroup);
}

という風に、ローカル変数を修飾している。

この修飾子は名前から予想できる通り、変数のスコープから抜けると自動的にfreeしてくれるらしい。

_cleanup_free_はマクロで、

src/shared/util.h
#define _cleanup_free_ _cleanup_(freep)

と定義されている。_cleanup_

src/shared/macro.h
#define _cleanup_(x) __attribute__((cleanup(x)))

という風に、GCCの__attribute__(cleanup)に展開される。この機能の説明は、Variable Attributes - Using the GNU Compiler Collection (GCC)をご参照ください。

一方、freep

src/shared/util.h
static inline void freep(void *p) {
        free(*(void**) p);
}

というインライン関数で、free(3)を読んでいる。変数のスコープから抜けた時に、この関数が呼ばれるらしい。

というわけで、かなり限定的ですが、最近ではCでも自動freeできるんですね。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?