Robert
Robert

Reputation: 57

libmysqlclient.18.dylib memory leak

PROBLEM: What's the cause of the memory leaks?

SITUATION: I've build a simple command line program using C++ together with MySQL using the MySQL C API

The problem is, the program has many "minor" memory leaks from the object malloc xx bytes" with xx ranging from a few bytes to 8 kb. All of the leaks links to the library libmysqlclient.18.dylib.

I've already removed all the mysql_free_result() from the code to see if that was the problem, but its still the same.

My MySQL code mainly consists of simple code like:

to connect:

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

executing a query:

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

example of a query:

void resetTable(std::string table)
{
    MYSQL *connection = databaseConnection();
    MYSQL_RES *result;

    std::string query = "truncate table " + table;
    result = getQuery(connection, query);

    mysql_close(connection);
}

Upvotes: 0

Views: 366

Answers (1)

user149341
user149341

Reputation:

First of all: Opening a new connection for every query (like you're doing in resetTable()) is incredibly wasteful. What you really want to do is open a single connection when the application starts, use that for everything (possibly by storing the connection in a global), and close it when you're done.

To answer your question, though: You need to call mysql_free_result() on result sets once you're done with them.

Upvotes: 1

Related Questions