繁体   English   中英

如何正确释放 Mysql C++ Connector 中的内存?

[英]How to Free Memory in Mysql C++ Connector correctly?

我想知道如何正确释放 Mysql C++ 连接器分配的内存。 在他们的代码示例中,据我所知,他们没有正确执行此操作: https : //dev.mysql.com/doc/connector-cpp/1.1/en/connector-cpp-examples-complete-example-1.html

它们只在 try 块中删除创建的对象,而在 catch 中不删除。 所以对于我的代码,我在 catch 块中添加了一个 delete 语句。 但这并不稳定。 大多数时候,catch 博客运行良好,但在某些情况下,catch 博客中的程序会因“双重释放”或“分段错误”而崩溃。 所以我现在只是删除了删除并且它正在工作。

但最好的方法是什么? 我的代码(免费)如下所示:

...

sql::mysql::MySQL_Driver *driver;
sql::Connection *con;

bool connect()
{
    driver=sql::mysql::get_mysql_driver_instance();
    try
    {
        con = driver->connect(server, user, password);
        con->setSchema(database);
    } catch (sql::SQLException &e)
    {

        std::cout << "Error connecting to the Database: " << e.what() << endl;
        if (con != NULL)
            delete con;
        return false;
    }

    return true;
}

void disconnect()
{
    delete con;
    con = NULL;
}



bool update() {

    sql::PreparedStatement *stmt = NULL;
    sql::ResultSet *res = NULL;
    bool ret;
    int value;


        if (!connect())
            return false;

        try
        {
            stmt =      con->prepareStatement("SELECT * FROM table1 WHERE id=?;");
            stmt->setInt64(1, 123ull);

            res = stmt->executeQuery();
            if (!res->first())
                ret = false;
            else
            {
                value=res->getInt("value");
                std::cout<< value <<endl;
                ret = true;

                delete stmt;
                stmt=NULL;

                stmt = con->prepareStatement("UPDATE table1 SET value=? WHERE id=?;");
                value++;
                stmt->setInt(1, value);
                stmt->setInt64(2, 123ull);
                stmt->executeQuery();

            }
        } catch (sql::SQLException &e)
        {

            std::cout << "Error executing Query: " << e.what();
            if (stmt != NULL)
                delete stmt;
            if (res != NULL)
                delete res;


            disconnect();
            return false;
        }

        delete stmt;
        delete res;
        disconnect();
        return ret;

}

似乎有问题,尤其是当excecuteQuery()抛出异常时,有时不会创建结果对象。

由于该代码段与实际代码不同 - 错误地使用了free而不是delete - 不幸的是我无法推断出问题的根源。 然而,特别推荐使用RAII以避免此类情况和混淆。 我会使用std::unique_ptr而不是原始指针作为起点。 标头是<memory>并且您不需要任何操作来删除指针。 您可以简单地重置con而不是disconnect()

sql::mysql::MySQL_Driver* driver;
std::unique_ptr<sql::Connection> con;
try{
    driver = (sql::mysql::get_mysql_driver_instance());
    con.reset(driver->connect(server, user, password));
}
...
con.reset(nullptr);//instead of disconnect

OP 中引用的文档指出不应明确删除驱动程序; 连接器会隐式地处理它。 换句话说,驱动程序归连接器所有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM