我想知道如何正确释放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()
引发异常时,有时没有结果对象被创建。
由于代码段与实际代码不同-错误地使用了free
而不是delete
-不幸的是,我无法推断出问题的根源。但是,特别推荐std::unique_ptr
而不是原始指针作为起点。标题为<memory>
,并且您无需执行任何操作即可删除指针。代替disconnect()
,您只需重置con
: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中引用的文档指出,不应明确删除驱动程序;连接器将隐式地处理它。换句话说,驱动程序归连接器所有。