我正在研究一个使用大量MySQL查询的系统,而且我遇到了一些内存问题我非常肯定我不能正确处理指针......
基本上,我有这样的事情:
MYSQL_ROW function1() {
string query="SELECT * FROM table limit 1;";
MYSQL_ROW return_row;
mysql_init(&connection); // "connection" is a global variable
if (mysql_real_connect(&connection,HOST,USER,PASS,DB,0,NULL,0)){
if (mysql_query(&connection,query.c_str()))
cout << "Error: " << mysql_error(&connection);
else{
resp = mysql_store_result(&connection); //"resp" is also global
if (resp) return_row = mysql_fetch_row(resp);
mysql_free_result(resp);
}
mysql_close(&connection);
}else{
cout << "connection failed\n";
if (mysql_errno(&connection))
cout << "Error: " << mysql_errno(&connection) << " " << mysql_error(&connection);
}
return return_row;
}
function2()
:
MYSQL_ROW function2(MYSQL_ROW row) {
string query = "select * from table2 where code = '" + string(row[2]) + "'";
MYSQL_ROW retorno;
mysql_init(&connection);
if (mysql_real_connect(&connection,HOST,USER,PASS,DB,0,NULL,0)){
if (mysql_query(&connection,query.c_str()))
cout << "Error: " << mysql_error(&conexao);
else{
// My "debugging" shows me at this point `row[2]` is already fubar
resp = mysql_store_result(&connection);
if (resp) return_row = mysql_fetch_row(resp);
mysql_free_result(resp);
}
mysql_close(&connection);
}else{
cout << "connection failed\n";
if (mysql_errno(&connection))
cout << "Error : " << mysql_errno(&connection) << " " << mysql_error(&connection);
}
return return_row;
}
main()
基本上是一个无限循环:
int main( int argc, char* args[] ){
MYSQL_ROW row = NULL;
while (1) {
row = function1();
if(row != NULL) function2(row);
}
}
(变量和函数名称已被推广以保护无辜者)
但是在第3或第4次拨打function2
后,仅使用row
进行阅读,row
开始失去其值,导致出现段错误...
任何人都有任何想法为什么?我不确定此代码中的全局变量数量是否有用,但我没有设计它,只有到明天才能修复并完成它,所以欢迎变通方法!
谢谢!
答案 0 :(得分:1)
更新:我误解了mysql结果是如何使用的。看起来row
指针数组指向您在function1()
中释放的结果数组,然后在function2()
中将其返回到堆后使用它。
在释放结果之前,您需要做的是将return_row[2]
复制到持久字符串。然后将其传递给function2()
。我看到你在function2()
做了类似的事情,所以你也需要在那里修复它(虽然在你的例子中你没有做任何有关其返回值的事情)。
另外,你是正确的free(row);
正确的做法。
答案 1 :(得分:0)
在处理mysql_fetch_row返回的行时,不应关闭连接或释放结果集。