2013-03-02 39 views
0

PROBLEM:什麼是內存泄漏的原因是什麼?libmysqlclient.18.dylib內存泄露

SITUATION: 我已經建立使用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; 
} 

執行查詢:

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

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

    mysql_close(connection); 
} 

回答

1
:查詢

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

例子首先是

:爲每個查詢打開一個新連接(例如您在resetTable()中執行的操作)非常浪費。您真正想要做的是在應用程序啓動時打開一個連接,將其用於所有內容(可能通過將連接存儲在全局中),並在完成時關閉它。

要回答你的問題,但:你需要調用mysql_free_result()的結果集上,一旦你與他們做。

+0

上面的例子只是一個,就像我說的例子。我沒有爲每個查詢打開一個新的連接:p無論如何,我已經嘗試在每個結果集之後放置'mysql_free_result()',但它仍然在泄漏。在另一個線程中,我已經閱讀關於在關閉連接後使用'mysql_library_end()'的內容。仍然是相同數量的泄漏... – Robert 2013-03-02 05:09:12

+0

該死的,在分解我的程序代碼後,我發現你實際上必須釋放每個**單個結果集。感謝黃昏! – Robert 2013-03-02 13:26:13