You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SQLiteCpp操作内存数据库时触发SQLITE_BUSY断言失败问题

SQLiteCpp析构时触发SQLITE_BUSY断言失败问题

错误信息

test: ./SQLiteCpp-3.3.0/src/Database.cpp:92: void SQLite::Database::Deleter::operator()(sqlite3*): Assertion `0 == ret && "database is locked"' failed.
Aborted (core dumped)

触发场景

该错误发生在SQLiteCpp库的Database析构函数调用sqlite3_close()关闭数据库连接时,返回值ret为SQLITE_BUSY(5)。根据SQLite文档,此错误通常因其他进程/线程持有连接,但本次场景不存在多进程/线程竞争情况。

相关代码结构

  • main.cpp中手动创建并删除NL对象
  • NL类包含以下成员:
    • optional<SQLite::Database>类型的db
    • unique_ptr<SQLite::Statement>类型的sqlst_insert_net
  • NL构造函数逻辑:初始化内存数据库,并调用compile_sql_statements编译SQL预编译语句

现象总结

  • 移除delete nl;语句,程序无报错
  • 移除compile_sql_statements调用(不编译预编译语句),程序无报错

实际项目约束

  • NL实例由shared_ptr持有,析构过程无法避免
  • 预编译语句是必需功能,不可移除

补充排查细节

  • 堆栈跟踪确认错误来自Database的Deleter断言
  • 进一步排查发现:Statement持有的TStatementPtr(shared_ptr)未触发sqlite3_finalize,说明Statement对象未被正确销毁

内容的提问来源于stack exchange,提问作者jpcgt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:12:41