C++ libmysqlclient.18.dylib内存泄漏
C++ libmysqlclient.18.dylib内存泄漏,c++,mysql,memory-leaks,C++,Mysql,Memory Leaks,问题:内存泄漏的原因是什么 情况: 我用C++和MySQL构建了一个简单的命令行程序,使用MySQL C API 问题是,程序有许多来自对象malloc xx bytes”的“轻微”内存泄漏,xx从几个字节到8 kb不等。所有泄漏链接到库libmysqlclient.18.dylib 我已经从代码中删除了所有的mysql\u free\u result(),看看这是否是问题所在,但还是一样 我的MySQL代码主要由以下简单代码组成: 要连接: MYSQL *databaseConnection(
问题
:内存泄漏的原因是什么
情况
:
我用C++和MySQL构建了一个简单的命令行程序,使用MySQL C API
问题是,程序有许多来自对象malloc xx bytes”
的“轻微”内存泄漏,xx从几个字节到8 kb不等。所有泄漏链接到库libmysqlclient.18.dylib
我已经从代码中删除了所有的mysql\u free\u result()
,看看这是否是问题所在,但还是一样
我的MySQL代码主要由以下简单代码组成:
要连接:
MYSQL *databaseConnection()
{
// declarations
MYSQL *connection = mysql_init(NULL);
// connecting to database
if(!mysql_real_connect(connection,SERVER,USER,PASSWORD,DATABASE,0,NULL,0))
{
std::cout << "Connection error: " << mysql_error(connection) << std::endl;
}
return connection;
}
首先:为每个查询打开一个新连接(就像您在
resetable()
中所做的那样)是非常浪费的。您真正想做的是在应用程序启动时打开一个连接,对所有事情都使用它(可能通过将连接存储在全局中),然后在完成后关闭它
不过,为了回答您的问题,您需要在处理完结果集后调用它们。上面的示例只是一个,正如我所说的示例。我不会为每个查询打开一个新连接:p无论如何,我已经尝试放置
mysql\u free\u result()
在每个结果集之后,但它仍然在泄漏。在另一个线程中,我读到了关于在关闭连接后使用mysql\u library\u end()
的内容。仍然有相同数量的泄漏…该死,在为代码分解我的程序代码之后,我发现你实际上必须释放每个结果集。谢谢!
MYSQL_RES *getQuery(MYSQL *connection, std::string query)
{
// send the query to the database
if (mysql_query(connection, query.c_str()))
{
std::cout << "MySQL query error: " << mysql_error(connection);
exit(1);
}
return mysql_store_result(connection);
}
void resetTable(std::string table)
{
MYSQL *connection = databaseConnection();
MYSQL_RES *result;
std::string query = "truncate table " + table;
result = getQuery(connection, query);
mysql_close(connection);
}