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 接口中的一个地方使用。指向此对象实例的指针是 sqlite3_config() 的参数,当配置选项为 SQLITE_CONFIG_MALLOC 或 SQLITE_CONFIG_GETMALLOC 时。通过创建此对象实例并将其传递给配置期间的 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 会持有 SQLITE_MUTEX_STATIC_MEM 互斥锁,只要 SQLITE_CONFIG_MEMSTATUS 配置选项处于打开状态(默认情况下是打开的),因此这些方法会自动序列化。但是,如果 SQLITE_CONFIG_MEMSTATUS 被禁用,那么其他方法必须是线程安全的,否则必须自行安排序列化。
SQLite 绝不会在调用 xShutdown() 之前多次调用 xInit()。