Подсистема распределения памяти
void *sqlite3_malloc(int); void *sqlite3_malloc64(sqlite3_uint64); void *sqlite3_realloc(void*, int); void *sqlite3_realloc64(void*, sqlite3_uint64); void sqlite3_free(void*); sqlite3_uint64 sqlite3_msize(void*);
Ядро SQLite использует эти три функции для всех своих внутренних потребностей в распределении памяти. «Ядро» в предыдущем предложении не включает реализацию VFS, специфичную для операционной системы. Windows VFS использует native malloc() и free() для некоторых операций.
Функция sqlite3_malloc() возвращает указатель на блок памяти размером не менее N байт, где N — параметр. Если sqlite3_malloc() не может получить достаточное количество свободной памяти, она возвращает указатель NULL. Если параметр N функции sqlite3_malloc() равен нулю или отрицательному значению, то sqlite3_malloc() возвращает указатель NULL.
Функция sqlite3_malloc64(N) работает так же, как sqlite3_malloc(N), за исключением того, что N — это целое 64-битное беззнаковое число вместо знакового 32-битного целого числа.
Вызов sqlite3_free() с указателем, ранее возвращённым функциями sqlite3_malloc() или sqlite3_realloc(), освобождает эту память, чтобы она могла быть повторно использована. Функция sqlite3_free() является пустой операцией (no-op), если ей передаётся указатель NULL. Передача указателя NULL в sqlite3_free() безопасна. После освобождения память не должна ни читаться, ни записываться. Даже чтение ранее освобождённой памяти может привести к ошибке сегментации или другой серьёзной ошибке. Повреждение памяти, ошибка сегментации или другие серьёзные ошибки могут возникнуть, если функция sqlite3_free() вызывается с ненулевым указателем, который не был получен из sqlite3_malloc() или sqlite3_realloc().
Интерфейс sqlite3_realloc(X,N) пытается изменить размер предыдущего выделения памяти X на не менее N байт. Если параметр X в sqlite3_realloc(X,N) равен указателю NULL, то его поведение идентично вызову sqlite3_malloc(N). Если параметр N в sqlite3_realloc(X,N) равен нулю или отрицательному значению, то поведение точно такое же, как при вызове sqlite3_free(X). sqlite3_realloc(X,N) возвращает указатель на выделение памяти размером не менее N байт или NULL, если памяти недостаточно. Если M — размер предыдущего выделения, то min(N,M) байт предыдущего выделения копируются в начало буфера, возвращаемого sqlite3_realloc(X,N), а предыдущее выделение освобождается. Если sqlite3_realloc(X,N) возвращает NULL, а N положительно, то предыдущее выделение не освобождается.
Интерфейс sqlite3_realloc64(X,N) работает так же, как sqlite3_realloc(X,N), за исключением того, что N — это 64-битное беззнаковое целое число вместо 32-битного знакового целого числа.
Если X — выделение памяти, ранее полученное из sqlite3_malloc(), sqlite3_malloc64(), sqlite3_realloc() или sqlite3_realloc64(), то sqlite3_msize(X) возвращает размер этого выделения памяти в байтах. Возвращаемое значение sqlite3_msize(X) может быть больше, чем количество байт, запрошенных при выделении X. Если X — указатель NULL, то sqlite3_msize(X) возвращает ноль. Если X указывает не на начало выделения памяти, или если он указывает на ранее валидное выделение памяти, которое теперь освобождено, то поведение sqlite3_msize(X) не определено и потенциально опасно.
Память, возвращённая функциями sqlite3_malloc(), sqlite3_realloc(), sqlite3_malloc64() и sqlite3_realloc64(), всегда выравнивается по крайней мере до 8-байтовой границы или до 4-байтовой границы, если используется опция компиляции SQLITE_4_BYTE_ALIGNED_MALLOC.
Аргументы-указатели функций sqlite3_free() и sqlite3_realloc() должны быть либо NULL, либо указателями, полученными от предыдущего вызова sqlite3_malloc() или sqlite3_realloc(), которые ещё не были освобождены.
Приложение не должно читать или записывать какую-либо часть блока памяти после его освобождения с помощью sqlite3_free() или sqlite3_realloc().
См. также списки Объектов, Констант и Функций.
SQLite is in the Public Domain.
https://sqlite.org/c3ref/free.html