SQlite源码分析

内存分配函数

Sqlite内存分配先关函数:SQLite需要动态分配一块内存时,它通常是调用底层操作系统默认的内存处理函数,使SQLite从应用程序堆中分配内存。然而,程序员可以通过sqlite3_config函数配置SQLite,使其进行自己的内部的内存管理。这对于嵌入式和手持终端等内存受限的设备来说非常重要,过度分配内存会给系统稳定性带来问题。下面是结构体及函数功能列表,如下表所示

表2.4.1 结构体功能列表

编号 结构体名称 功能
1 MemBlockHdr 内存分配结构

表2.4.2 mem0-2.c函数功能列表

编号 函数名 功能
1 static void *sqlite3MemMalloc(int nByte) 在内存的动态分配存储区中分配一块长度为nByte字节的连续区域,参数nByte为需要内存空间的长度,返回该区域的首地址。
2 static void sqlite3MemFree(void *pPrior) 释放pPrior指向的存储空间,被释放的空间通常被送入可用存储区域,以后可在调用malloc、realloc函数来再分配。
3 Static void sqlite3MemRealloc(void pPrior, int nByte) 给一个已经分配了地址的指针重新分配空间,参数pPrior为原有空间地址,nByte是重新申请的地址长度。
4 static int 函数返回已分配内存的大小,也能够跟踪未归还内存的字节数,它能确定当一个分配被释放时有多少字节从未归还内存中移除。
sqlite3MemSize(void *p)
5 static int sqlite3MemRoundup(int n) 函数返回下一个有效内存分配的大小。
6 static int sqlite3MemInit(void *NotUsed) 函数初始化
7 void sqlite3MemSetDefault(void) 函数填充底层的内存分配函数指针
8 static void sqlite3MemShutdown(void *NotUsed) 取消函数的初始化
9 static struct MemBlockHdr sqlite3MemsysGetHeader(void pAllocation) 函数设置哨兵对内存破坏进行检查
10 static void randomFill(char *pBuf, int nByte) 函数填充伪随机字节的缓冲区,预留一个内存分配到不可预测值并清除释放不可预测值的内容。
11 void sqlite3MemdebugSetType 设置内存分配的类型
(void *p, u8 eType)
12 int sqlite3MemdebugHasType(void *p, u8 eType) 函数使用assert()语句验证内存分配的类型
13 int sqlite3MemdebugNoType(void *p, u8 eType) 验证内存分配的类型
14 void sqlite3MemdebugBacktrace 函数设置每个内存分配回溯跟踪级别数
(int depth)
15 void sqlite3MemdebugBacktraceCallback(void (xBacktrace)(int, int, void *)) 函数内存分配的回调函数
16 void sqlite3MemdebugSettitle(const char *zTitle) 函数设置标题字符串进行后续的分配
17 void sqlite3MemdebugSync() 函数同步
18 void sqlite3MemdebugDump(const char *zFilename) 函数打印调用栈
19 int sqlite3MemdebugMallocCount() 函数返回sqlite3MemdebugMalloc()被调用的次数
20 extern int backtrace(void**,int) 函数用于获取当前线程的调用堆栈,获取的信息将会被存在指针数组中,函数返回值是实际获取的指针的个数。
21 extern void backtrace_symbols_fd(voidconst,int,int) 从backtrace函数获取的信息转化为一个字符串数组,函数返回将结果写入文件描述符为fd的文件中,每个函数对应一行。

Mem0.c是空操作的内存分配器,函数分配的结果返回0,比较简单没有实际运用的价值,但是他可以链接一些自定义的内存分配器函数。Mem1.c是缺省内存分配器,所使用的内存分配函数都是C语言标准库中的内存分配函数,在没有特别指明的情况下,SQLite会自动调用系统这个内存分配器。Mem2.c是调试内存分配器,这个内存分配器运用较少,因为这个内存分配器的速度较慢,一般不常用。但是如果这个内存分配器被激活的话,它有一些其他的检查功能。