SQLite C 接口
内存分配子系统
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 使用本机 malloc() 和 free() 进行某些操作。
sqlite3_malloc() 例程返回一个指向内存块的指针,该内存块的长度至少为 N 字节,其中 N 是参数。如果 sqlite3_malloc() 无法获得足够的空闲内存,它会返回一个 NULL 指针。如果 sqlite3_malloc() 的参数 N 为零或负数,则 sqlite3_malloc() 返回 NULL 指针。
sqlite3_malloc64(N) 例程的工作方式与 sqlite3_malloc(N) 类似,只是 N 是无符号 64 位整数而不是带符号的 32 位整数。
使用先前由 sqlite3_malloc() 或 sqlite3_realloc() 返回的指针调用 sqlite3_free() 会释放该内存,以便它可以被重用。如果使用 NULL 指针调用,则 sqlite3_free() 例程是空操作。将 NULL 指针传递给 sqlite3_free() 是无害的。释放后,不应读取或写入内存。即使读取以前释放的内存也可能导致分段错误或其他严重错误。如果使用不是从 sqlite3_malloc() 或 sqlite3_realloc() 获得的非 NULL 指针调用 sqlite3_free(),则可能会导致内存损坏、分段错误或其他严重错误。
sqlite3_realloc(X,N) 接口尝试将先前的内存分配 X 调整为至少 N 字节。如果 sqlite3_realloc(X,N) 的 X 参数是 NULL 指针,那么它的行为与调用 sqlite3_malloc(N) 相同。如果 sqlite3_realloc(X,N) 的 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 字节边界,如果使用SQLITE_4_BYTE_ALIGNED_MALLOC编译时选项,则始终对齐到 4 字节边界。
sqlite3_free()和sqlite3_realloc()的指针参数 必须是 NULL 或从先前调用sqlite3_malloc()或sqlite3_realloc()获得的尚未释放的指针。
在使用sqlite3_free()或sqlite3_realloc()释放内存块后,应用程序不得读取或写入内存块的任何部分 。