小巧。快速。可靠。
三选二。

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() 会释放该内存,以便可以重用它。如果 sqlite3_free() 使用 NULL 指针调用,则该例程为空操作。将 NULL 指针传递给 sqlite3_free() 是无害的。释放后,不应读取或写入内存。即使读取先前已释放的内存也可能导致分段错误或其他严重错误。如果 sqlite3_free() 使用未从 sqlite3_malloc() 或 sqlite3_realloc() 获取的非 NULL 指针调用,则可能导致内存损坏、分段错误或其他严重错误。

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() 释放内存块后读取或写入该内存块的任何部分。

另请参见 对象常量函数 列表。