c++ - libmysqlclient.18.dylib 内存泄漏

标签 c++ mysql memory-leaks

问题:内存泄漏的原因是什么?

情况: 我使用 C++ 和使用 MySQL C API 的 MySQL 构建了一个简单的命令行程序

问题是,程序从对象 malloc xx bytes" 中发生了许多“小”内存泄漏,其中 xx 的范围从几个字节到 8 kb。所有泄漏都链接到库 libmysqlclient.18.dylib.

我已经从代码中删除了所有 mysql_free_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;
}

执行查询:

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);
}

最佳答案

首先:为每个查询打开一个新连接(就像您在 resetTable() 中所做的那样)是非常浪费的。您真正想要做的是在应用程序启动时打开一个连接,将其用于所有内容(可能通过将连接存储在全局中),并在完成后关闭它。

不过,要回答您的问题:您需要调用 mysql_free_result()完成后在结果集上。

关于c++ - libmysqlclient.18.dylib 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15170881/

相关文章:

c++ - 是否可以使用 type_traits 来区分 char 和 wchar_t?

c++ - 在这种情况下正确使用移动语义?

php - 如何建立一个多语言网站

php - 这个 MySQL 准备好的语句有什么问题? "unkown column in where clause"

php - 查询具有一对多关系的两个表

iphone - NSMutableArray 与 NSMutableDictionary 的一个奇怪问题

ios - 如何使用 Instruments (Leaks) - Xcode 查找 C 或 C++ 代码泄漏?

c++ - 为什么以下代码会使我的计算机发出蜂鸣声?

java - Android 内存泄漏新线程()

c++ - 关于继承的困惑