SQLite C 接口
内存分配例程
typedef struct sqlite3_mem_methods sqlite3_mem_methods; struct sqlite3_mem_methods { void *(*xMalloc)(int); /* Memory allocation function */ void (*xFree)(void*); /* Free a prior allocation */ void *(*xRealloc)(void*,int); /* Resize an allocation */ int (*xSize)(void*); /* Return the size of an allocation */ int (*xRoundup)(int); /* Round up request size to allocation size */ int (*xInit)(void*); /* Initialize the memory allocator */ void (*xShutdown)(void*); /* Deinitialize the memory allocator */ void *pAppData; /* Argument to xInit() and xShutdown() */ };
该对象的实例定义了 SQLite 和低级内存分配例程之间的接口。
该对象仅在 SQLite 界面中的一个地方使用。当配置选项为 SQLITE_CONFIG_MALLOC或SQLITE_CONFIG_GETMALLOC时,指向该对象实例的指针是 sqlite3_config()的参数。通过创建该对象的一个实例并在配置期间将其传递给sqlite3_config ( SQLITE_CONFIG_MALLOC ),应用程序可以为 SQLite 指定一个替代内存分配子系统以用于其所有动态内存需求。
请注意,SQLite 带有几个内置的内存分配器 ,这些内存分配器完全适合绝大多数应用程序,并且该对象仅对极少数具有专门内存分配要求的应用程序有用。在测试 SQLite 期间也使用此对象,以指定模拟内存耗尽情况的替代内存分配器,以验证 SQLite 是否从此类情况中正常恢复。
xMalloc、xRealloc 和 xFree 方法必须像标准 C 库中的 malloc()、realloc() 和 free() 函数一样工作。SQLite 保证 xRealloc 的第二个参数始终是先前调用 xRoundup 返回的值。
xSize 应返回先前从 xMalloc 或 xRealloc 获得的内存分配的分配大小。分配的大小始终至少与请求的大小一样大,但也可能更大。
xRoundup 方法返回给定特定请求大小的内存分配的分配大小。大多数内存分配器将内存分配至少舍入到 8 的下一个倍数。一些分配器舍入到更大的倍数或 2 的幂。通过sqlite3_malloc() 或sqlite3_realloc()进入的每个内存分配请求首先调用 xRoundup。如果 xRoundup 返回 0,则会导致相应的内存分配失败。
xInit 方法初始化内存分配器。例如,它可能会分配任何所需的互斥体或初始化内部数据结构。xShutdown 方法由 sqlite3_shutdown()调用(间接)并且应该释放 xInit 获取的任何资源。pAppData 指针用作 xInit 和 xShutdown 的唯一参数。
SQLite 在调用 xInit 方法时持有SQLITE_MUTEX_STATIC_MAIN互斥量,因此 xInit 方法不需要是线程安全的。xShutdown 方法仅从sqlite3_shutdown()调用,因此它也不需要是线程安全的。对于所有其他方法,只要 打开SQLITE_CONFIG_MEMSTATUS配置选项(默认情况下),SQLite 就会持有SQLITE_MUTEX_STATIC_MEM互斥体,因此这些方法会自动序列化。但是,如果SQLITE_CONFIG_MEMSTATUS被禁用,那么其他方法必须是线程安全的,否则会自行安排序列化。
如果没有对 xShutdown() 的干预调用,SQLite 将永远不会多次调用 xInit()。