Hide navigation sidebar
Hide table of contents sidebar
Back to top
Toggle table of contents sidebar

# bson_t lifetimes

A bson_t may contain its data directly or may contain pointers to heap-allocated memory. Overwriting an existing bson_t or allowing a stack-allocated bson_t to go out of scope may cause a memory leak. A bson_t should always be destroyed with bson_destroy().

## bson_t out parameters

A bson_t pointer used as an out parameter must point to valid overwritable storage for a new bson_t which must be one of:

1. Uninitialized storage for a bson_t.

2. A zero-initialized bson_t object.

3. A bson_t object initialized with `BSON_INITIALIZER`.

4. A bson_t object not created with bson_new() that was destroyed with bson_destroy().

This can be on the stack:

    bson_t stack_doc = BSON_INITIALIZER;
    example_get_doc (&stack_doc);
    bson_destroy (&stack_doc);

Or on the heap:

    bson_t *heap_doc = bson_malloc (sizeof (bson_t));
    example_get_doc (heap_doc);
    bson_destroy (heap_doc);
    bson_free (heap_doc);

Omitting bson_destroy() in either case may cause memory leaks.

Warning

Passing a bson_t pointer obtained from bson_new() as an out parameter will result in a leak of the bson_t struct.

    bson_t *heap_doc = bson_new ();
    example_get_doc (heap_doc);
    bson_destroy (heap_doc); // Leaks the `bson_t` struct!