使用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>类型的dbunique_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
相关产品推荐
相关产品推荐

