小巧。快速。可靠。
三者择其二。

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 接口中的一个地方使用。指向此对象实例的指针是 sqlite3_config() 的参数,当配置选项为 SQLITE_CONFIG_MALLOCSQLITE_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()。

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