When using dbstl, make sure memory allocated in the heap is released after use. The rules for this are:
dbstl will free/delete any memory allocated by dbstl itself.
You are responsible for freeing/deleting any memory allocated by your code outside of dbstl.
When you open a DbEnv
or
Db
object using
dbstl::open_env()
or
dbstl::open_db()
, you do
not need to delete that object. However, if you new'd
that object and then opened it without using the
dbstl::open_env()
or
dbstl::open_db()
methods,
you are responsible for deleting the object.
Note that you must new
the
Db
or
DbEnv
object, which
allocates it on the heap. You can not allocate it on
the stack. If you do, the order of destruction is
uncontrollable, which makes dbstl unable to work
properly.
You can call dbstl_exit()
before the process exits, to release any memory
allocated by dbstl that has to live during the entire
process lifetime. Releasing the memory explicitly will
not make much difference, because the process is about
to exit and so all memory allocated on the heap is
going to be returned to the operating system anyway.
The only real difference is that your memory leak
checker will not report false memory leaks.
dbstl_exit()
releases any memory
allocated by dbstl on the heap. It also performs other
required shutdown operations, such as closing any
databases and environments registered to dbstl and
shared across the process.
If you are calling the
dbstl_exit()
function, and
your DbEnv
or
Db
objects are new'd by
your code, the dbstl_exit()
function should be called before deleting the
DbEnv
or
Db
objects, because they
need to be closed before being deleted. Alternatively,
you can call the
dbstl::close_env()
or
dbstl::close_db()
functions before deleting the
DbEnv
or
Db
objects in order to
explicitly close the databases or environments. If you
do this, can then delete these objects, and then call
dbstl_exit()
.
In addition, before exiting a thread that uses
dbstl API, you can call the
dbstl_thread_exit()
function
to release any Berkeley DB handles if they are not
used by other threads. If you do not call the
dbstl_thread_exit()
function
or call this function only in some threads, all open
Berkeley DB handles will be closed by the
dbstl_exit()
function. You
must call the dbstl_exit()
function before the process exits, to avoid
memory leak and database update loss, if you do not
have transactions and persistent log files.
Only when you are storing raw bytes (such as a
bitmap) do you have to store and retrieve data by
using the DbstlDbt
helper
class. Although you also can do so simply by using the
Berkeley DB Dbt
class, the
DbstlDbt
class offers more
convenient memory management behavior.
When you are storing
DbstlDbt
objects (such as
db_vector<DbstlDbt>
),
you must allocate heap memory
explicitly using the malloc()
function for the DbstlDbt
object to reference, but you do not need to free the
memory – it is automatically freed by the
DbstlDbt
object that owns
it by calling the standard C library
free()
function.
However, because dbstl supports storing any type of
object or primitive data, it is rare that you would
have to store data using
DbstlDbt
objects while
using dbstl. Examples of storing
DbstlDbt
objects can be
found in the
StlAdvancedFeaturesExample::arbitrary_object_storage()
and
StlAdvancedFeaturesExample::char_star_string_storage()
methods.