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_MALLOCSQLITE_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()。

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