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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:27:02