![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Ядро SQLite использует эти три функции
для всех его собственных потребностей распределения внутренней памяти.
"Ядро" в предыдущем предложении не включает операционную систему
и специфичную VFS. Windows VFS использует нативные
malloc() и free(). sqlite3_malloc() возвращает указатель на блок памяти, по крайней мере
N байт в длину, где N параметр. Если sqlite3_malloc()
не может получить достаточную свободную память, он возвращает NULL.
Если параметр N = 0 или отрицателен, sqlite3_malloc() возвращает NULL. sqlite3_malloc64(N) обычно работает точно так же, как
sqlite3_malloc(N), но N это unsigned 64-bit integer вместо
signed 32-bit integer. sqlite3_free() с указателем, ранее возвращенным
sqlite3_malloc() или sqlite3_realloc(), освобождает
память так, чтобы это могло бы быть снова использовано.
sqlite3_free() ничего не делает, если вызван с NULL. Передача NULL в
sqlite3_free() безопасна. Будучи освобожденной, память не должна быть
прочитана или написана. Даже чтение ранее освобожденной памяти могло бы
привести к ошибке сегментации или другой серьезной ошибке.
Повреждение памяти, ошибка сегментации или другая серьезная ошибка могли бы
возникнуть, если вызывают sqlite3_free() с указателем не-NULL,
который не был получен из sqlite3_malloc() или sqlite3_realloc(). sqlite3_realloc(X,N) пытается изменить размеры предшествующего выделения
памяти X, чтобы быть по крайней мере N байтами.
Если X параметр для sqlite3_realloc(X,N) = NULL,
его поведение идентично sqlite3_malloc(N).
Если N для sqlite3_realloc(X,N) = 0 или отрицателен,
поведение точно то же самое, как у 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-bit unsigned integer вместо
32-bit signed integer. Если X это выделение памяти, ранее полученное из sqlite3_malloc(),
sqlite3_malloc64(), sqlite3_realloc() или sqlite3_realloc64(),
sqlite3_msize(X) вернет размер того выделения памяти в байтах.
Значение, возвращенное sqlite3_msize(X),
могло бы быть больше, чем заказанное число байтов, когда X был
ассигнован. Если X = NULL, то sqlite3_msize(X) вернет 0.
Если 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().
Choose any three.
SQLite C Interface
Подсистема выделения памяти
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*);