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できるんですね。