mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
core: C++-ify membuffer
C-style memory management is a pain and nearly nobody seems to get it right. Add a C++-version of membuffer that frees the buffer when it gets out-of-scope. Originally, I was thinking about conditionally adding a constructor/destructor pair when compiling with C++. But then decided to create a derived class membufferpp, because it would be extremely confusing to have behavioral change when changing a source from from C to C++ or vice-versa. Also add a comment about the dangers of returned pointer: They become dangling on changes to the membuffer. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
0c84f369c3
commit
f142e9a9c6
5 changed files with 26 additions and 9 deletions
|
|
@ -36,10 +36,6 @@
|
|||
#ifndef MEMBUFFER_H
|
||||
#define MEMBUFFER_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
|
@ -50,6 +46,17 @@ struct membuffer {
|
|||
char *buffer;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
// In C++ code use this - it automatically frees the buffer, when going out of scope.
|
||||
struct membufferpp : public membuffer {
|
||||
membufferpp();
|
||||
~membufferpp();
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define __printf(x, y) __attribute__((__format__(__printf__, x, y)))
|
||||
#else
|
||||
|
|
@ -64,6 +71,8 @@ extern void put_bytes(struct membuffer *, const char *, int);
|
|||
extern void put_string(struct membuffer *, const char *);
|
||||
extern void put_quoted(struct membuffer *, const char *, int, int);
|
||||
extern void strip_mb(struct membuffer *);
|
||||
|
||||
/* The pointer obtained by mb_cstring is invalidated by any modifictation to the membuffer! */
|
||||
extern const char *mb_cstring(struct membuffer *);
|
||||
extern __printf(2, 0) void put_vformat(struct membuffer *, const char *, va_list);
|
||||
extern __printf(2, 0) void put_vformat_loc(struct membuffer *, const char *, va_list);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue