From: John Marshall Date: Wed, 12 Mar 2014 14:33:12 +0000 (+0000) Subject: Add ks_release() to kstring.h X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=93531803a8dd0d2e357ad1b8fd90e07162d0e660;p=klib.git Add ks_release() to kstring.h Using this function is a more explicit way of transferring ownership than just "foo = str.s"; the latter leaves room for readers to wonder whether a subsequent "free(str.s)" has been forgotten. --- diff --git a/kstring.h b/kstring.h index 0e654cb..2567efc 100644 --- a/kstring.h +++ b/kstring.h @@ -49,9 +49,8 @@ * kstring_t str = { 0, 0, NULL }; * kstring_t str; ...; str.l = str.m = 0; str.s = NULL; * and either ownership of the underlying buffer should be given away before - * the object disappears (i.e., the str.s pointer copied and something else - * responsible for freeing it), or the kstring_t should be destroyed with - * free(str.s); */ + * the object disappears (see ks_release() below) or the kstring_t should be + * destroyed with free(str.s); */ #ifndef KSTRING_T #define KSTRING_T kstring_t typedef struct __kstring_t { @@ -111,6 +110,18 @@ static inline size_t ks_len(kstring_t *s) return s->l; } +// Give ownership of the underlying buffer away to something else (making +// that something else responsible for freeing it), leaving the kstring_t +// empty and ready to be used again, or ready to go out of scope without +// needing free(str.s) to prevent a memory leak. +static inline char *ks_release(kstring_t *s) +{ + char *ss = s->s; + s->l = s->m = 0; + s->s = NULL; + return ss; +} + static inline int kputsn(const char *p, int l, kstring_t *s) { if (s->l + l + 1 >= s->m) {