mysqlcppconn driver出现内存泄漏 对应C++数据库操作代码问题求助
问题1:连接对象作用域错误
你在connect()函数内声明的std::unique_ptr<sql::Connection> con是局部变量,函数执行结束后局部变量自动析构,所持有的数据库连接会直接被释放。你后续在函数外调用con->setSchema时操作的是悬空指针,不仅会导致内存异常,也无法正确管理连接生命周期。
问题2:PreparedStatement对象未释放
con->prepareStatement返回的sql::PreparedStatement*指针需要手动销毁,你执行完execute后没有释放该对象,直接造成内存泄漏。
问题3:逻辑流程错误
connect()函数仅返回bool值,无法把建立好的连接传递到外部使用,当前代码逻辑下就算没有报错,后续的数据库操作也全部是基于无效指针执行的。
修正方案
你可以调整代码如下:
// 把连接对象的生命周期提到调用层级,或者封装为类成员 std::unique_ptr<sql::Connection> con; std::unique_ptr<sql::PreparedStatement> pstmt; bool connect() { sql::Driver* driver; try { driver = get_driver_instance(); con.reset(driver->connect("tcp://127.0.0.1:3306", "root", "root")); return true; } catch (sql::SQLException& e) { std::cout << "Error connecting to the Database: " << e.what() << endl; con.reset(nullptr); return false; } } // 调用逻辑 if (connect()) { try { con->setSchema("class"); pstmt.reset(con->prepareStatement("INSERT INTO test(q, w, e, r) VALUES(?,?,?,?)")); pstmt->setString(1, a); pstmt->setString(2, s); pstmt->setString(3, d); pstmt->setBlob(4, &f); pstmt->execute(); // 操作完成后可主动释放pstmt,也可以等unique_ptr自动析构 pstmt.reset(); // 所有数据库操作完成后释放连接 con.reset(); } catch (sql::SQLException& e) { std::cout << "Database operation error: " << e.what() << endl; pstmt.reset(); con.reset(); } }
额外注意事项:
sql::Driver是全局单例,不需要手动释放,重复调用get_driver_instance()也不会产生新对象,不会造成泄漏- 所有mysqlcppconn返回的原始指针(Connection、PreparedStatement、ResultSet等)都建议用智能指针管理,避免手动管理遗漏导致的泄漏
- 如果是长时间运行的程序,不要频繁创建销毁连接,建议使用连接池复用连接
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

