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

问题描述 投票:0回答:1

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

它们仅在try块中删除创建的对象,而不在catch中删除。因此,对于我的代码,我在catch块中添加了一条delete语句。但这不能稳定工作。在大多数情况下,捕获博客运行良好,但是在某些情况下,程序会由于捕获博客中的“ double Free”或“ Segmentation Fault”而崩溃。所以我现在只是删除了删除,并且可以正常工作。

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

...

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()引发异常时,有时没有结果对象被创建。

c++ mysql
1个回答
0
投票

由于代码段与实际代码不同-错误地使用了free而不是delete-不幸的是,我无法推断出问题的根源。但是,特别推荐以避免此类情况和混乱。我将使用[std::unique_ptr而不是原始指针作为起点。标题为<memory>,并且您无需执行任何操作即可删除指针。代替disconnect(),您只需重置consql::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中引用的文档指出,不应明确删除驱动程序;连接器将隐式地处理它。换句话说,驱动程序归连接器所有。
© www.soinside.com 2019 - 2024. All rights reserved.