c / expert
Snippet
Reference-Counted Object Management with Dynamic Destructors
This snippet constructs a dynamic reference counting and destructor cleanup header for C structures. Attaching a destructor function pointer to a reference counter struct enables automated lifetime management and clean destruction when reference counts drop to zero.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>#include <stdlib.h>typedef struct RefCounted RefCounted;typedef void (*DestructorFunc)(void* self);struct RefCounted {size_t ref_count;DestructorFunc dtor;};void ref_init(RefCounted* obj, DestructorFunc dtor) {obj->ref_count = 1;obj->dtor = dtor;}void ref_retain(RefCounted* obj) {if (obj) obj->ref_count++;}void ref_release(RefCounted* obj) {if (obj && --obj->ref_count == 0) {if (obj->dtor) obj->dtor(obj);}}typedef struct {RefCounted ref;int handle;} Resource;void resource_destroy(void* ptr) {Resource* res = (Resource*)ptr;printf("Closing resource handle %d\n", res->handle);free(res);}int main(void) {Resource* r = (Resource*)malloc(sizeof(Resource));ref_init(&r->ref, resource_destroy);r->handle = 42;ref_retain(&r->ref);ref_release(&r->ref);ref_release(&r->ref);return 0;}
Breakdown
1
struct RefCounted { size_t ref_count; DestructorFunc dtor; };
Holds lifetime state including reference counter and generic object destructor callback.
2
void ref_retain(RefCounted* obj) { if (obj) obj->ref_count++; }
Increments internal reference counter to share object ownership across references.
3
if (obj && --obj->ref_count == 0) { if (obj->dtor) obj->dtor(obj); }
Decrements count and automatically triggers object custom destructor upon reaching zero references.
4
ref_init(&r->ref, resource_destroy);
Binds specific destruction logic function to embedded reference tracking header.