Small. Fast. Reliable.
Choose any three.

SQLite C接口

内存分配子系统

无效* sqlite3_malloc(int);
无效* 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()释放应用程序后,该应用程序不得读取或写入该内存块的任何部分 。

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