docs/Writerside/topics/allocator.h.md

Fri, 23 May 2025 12:44:24 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 23 May 2025 12:44:24 +0200
changeset 1327
ed75dc1db503
parent 1319
aa1f580f8f59
child 1330
33c95cfc088e
permissions
-rw-r--r--

make test-compile depend on both static and shared

the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # Allocator
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
3 The allocator interface provides a mechanism to implement own custom allocators
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
4 that can also be used in many other function in UCX.
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
5
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
6 A default allocator implementation using the stdlib functions is
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
7 available via the global symbol `cxStdlibAllocator`,
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
8 and UCX also provides a [memory pool](mempool.h.md) implementation.
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
9 You are free to add your additional, own custom implementations.
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
10 A general sketch that illustrates how to do this can be found [below](#custom-allocator).
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
11
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
12 ## Default Allocator
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
13
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
14 The global default allocator which is used by UCX,
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
15 when no specific allocator is specified,
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
16 can be configured via the `cxDefaultAllocator`.
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
17 It is by default set to the `cxStdlibAllocator`.
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
18
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
19 ## Overview
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
20
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
21 ```C
1174
ee473780cc0d add missing documentation about what header to include
Mike Becker <universe@uap-core.de>
parents: 1171
diff changeset
22 #include <cx/allocator.h>
ee473780cc0d add missing documentation about what header to include
Mike Becker <universe@uap-core.de>
parents: 1171
diff changeset
23
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
24 void *cxMalloc(const CxAllocator *allocator, size_t n);
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
25
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
26 void *cxCalloc(const CxAllocator *allocator,
1210
2ad0cf0f314b complete the printf documentation and fix code formatting
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
27 size_t nmemb, size_t size);
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
28
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
29 void *cxRealloc(const CxAllocator *allocator, void *mem, size_t n);
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
30
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
31 void *cxReallocArray(const CxAllocator *allocator, void *mem,
1210
2ad0cf0f314b complete the printf documentation and fix code formatting
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
32 size_t nmemb, size_t size);
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
33
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
34 int cxReallocate(const CxAllocator *allocator, void **mem, size_t n);
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
35
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
36 int cxReallocateArray(const CxAllocator *allocator, void **mem,
1210
2ad0cf0f314b complete the printf documentation and fix code formatting
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
37 size_t nmemb, size_t size);
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
38
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
39 void cxFree(const CxAllocator *allocator, void *mem);
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
40
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
41 int cx_reallocate(void **mem, size_t size);
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
42
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
43 int cx_reallocatearray(void **mem, size_t nmemb, size_t size);
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
44
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
45 // predefined allocator that uses stdlib functions
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
46 CxAllocator * const cxStdlibAllocator;
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
47
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
48 // default allocator that can be changed
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
49 CxAllocator *cxDefaultAllocator = cxStdlibAllocator;
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
50
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
51 // Convenience macros that invokes above functions with the cxDefaultAllocator.
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
52 #define cxMallocDefault(...)
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
53 #define cxCallocDefault(...)
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
54 #define cxReallocDefault(...)
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
55 #define cxReallocateDefault(...)
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
56 #define cxReallocateArrayDefault(...)
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
57 #define cxReallocArrayDefault(...)
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
58 #define cxFreeDefault(...)
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
59 ```
1146
151c057faf7c add marker to every incomplete page
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
60
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
61 > All UCX functions that are not _explicitly_ designed for taking an allocator argument
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
62 > (recognizable by a `_a` suffix in the function's name) do support a `NULL` argument
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
63 > in which case the `cxDefaultAllocator` will be used.
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
64 >
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
65 > You may change the default allocator at any time, but it is strongly recommended to
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
66 > do it only once at program start to avoid accidentally freeing memory that was
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1210
diff changeset
67 > allocated by a different allocator.
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
68
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
69 ## Description
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
70
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
71 The functions `cxMalloc()`, `cxCalloc()`, `cxRealloc()`, `cxReallocArray()`, and `cxFree()`
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
72 invoke the memory management functions specified in the `allocator` and should behave like
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
73 their respective stdlibc pendants.
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
74 Implementations of the allocator interface are strongly encouraged to guarantee this behavior,
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
75 most prominently that invocations of `cxFree()` with a `NULL`-pointer for `mem` are ignored
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
76 instead of causing segfault error.
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
77
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
78 Additionally, UCX provides the functions `cxReallocate()` and `cxReallocateArray()`, as well as
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
79 their independent pendants `cx_reallocate()` and `cx_reallocatearray()`.
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
80 All those functions solve the problem that a possible reallocation might fail,
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
81 leading to a quite common programming mistake:
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
82
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
83 ```C
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
84 // common mistake - mem will be lost hen realloc() returns NULL
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
85 mem = realloc(mem, capacity + 32);
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
86 if (mem == NULL) // ... do error handling
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
87 ```
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
88
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
89 The above code can be replaced with `cx_reallocate()` which keeps the pointer intact and returns an error code instead.
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
90
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
91 ```C
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
92 // when cx_reallocate() fails, mem will still point to the old memory
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
93 if (cx_reallocate(&mem, capacity + 32)) // ... do error handling
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
94 ```
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
95
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
96 > Please pay special attention to always use `cxFree()` and the `cxRealloc()`-family of functions
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
97 > with the **same** allocator that was used to allocate the memory.
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
98 {style="warning"}
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
99
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
100 ## Custom Allocator
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102 If you want to define your own allocator, you need to initialize the `CxAllocator` structure
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
103 with a pointer to an allocator class (containing function pointers for the memory management
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
104 functions) and an optional pointer to custom data. An example is shown below:
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106 ```c
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
107
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108 struct my_allocator_state {
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
109 // ... some internal state ...
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 };
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 static cx_allocator_class my_allocator_class = {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 my_malloc_impl,
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
114 my_realloc_impl, // all these functions are somewhere defined
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115 my_calloc_impl,
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116 my_free_impl
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
117 };
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
118
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
119 CxAllocator create_my_allocator(void) {
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120 CxAllocator alloc;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
121 alloc.cl = &my_allocator_class;
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
122 struct my_allocator_state *state = malloc(sizeof(*state));
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
123 // ... initialize state ...
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
124 alloc.data = state;
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 return alloc;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 }
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
127
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
128 void destroy_my_allocator(CxAllocator *al) {
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
129 struct my_allocator_state *state = al->state;
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
130 // ... destroy state --
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
131 free(state);
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
132 }
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
133 ```
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
134
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
135 When you are implementing
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
136
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
137 ## Destructor Functions
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
138
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
139 The `allocator.h` header also declares two function pointers for destructor functions.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
140
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
141 ```C
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
142 typedef void (*cx_destructor_func)(void *memory);
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
143 typedef void (*cx_destructor_func2)(void *data, void *memory);
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
144 ```
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
145
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
146 The first one is called _simple_ destructor (e.g. in the context of [collections](collection.h.md)),
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
147 and the second one is called _advanced_ destructor.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
148 The only difference is that you can pass additional custom `data` to an advanced destructor function.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
149
1210
2ad0cf0f314b complete the printf documentation and fix code formatting
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
150 Destructor functions play a vital role in deep deallocations.
2ad0cf0f314b complete the printf documentation and fix code formatting
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
151 Another scenarios, besides destroying elements in a collection, are the deallocation of objects
2ad0cf0f314b complete the printf documentation and fix code formatting
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
152 stored in a [memory pool](mempool.h.md) or deallocations of deeply nested [JSON](json.h.md) objects.
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
153
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
154 > Destructor functions are not to be confused with `free()`-like functions.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
155 > The fundamental differences are that
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
156 > * it is not safe to pass `NULL` to a destructor function
1210
2ad0cf0f314b complete the printf documentation and fix code formatting
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
157 > * a destructor may only deallocate the contents inside an object but not the object itself, depending on context
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
158 >
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
159 {style="note"}
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
160
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
161 > For example, when you are using a [list](list.h.md) that stores elements directly, a destructor function
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
162 > assigned to that collection may only destroy the element's contents but must not deallocate the element's memory.
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
163 > On the other hand, when the list is storing just pointers to the elements, you _may_ want the destructor
1210
2ad0cf0f314b complete the printf documentation and fix code formatting
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
164 > function to also deallocate the element's memory when the element is removed from that list.
1171
155bc3b0dcb3 adds documentation for destructor functions and collections
Mike Becker <universe@uap-core.de>
parents: 1169
diff changeset
165
1169
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
166 <seealso>
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
167 <category ref="apidoc">
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
168 <a href="https://ucx.sourceforge.io/api/allocator_8h.html">allocator.h</a>
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
169 </category>
6a33a5648027 add documentation for allocator.h
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
170 </seealso>

mercurial