Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回MYSQL\u行的函数_C++_Mysql - Fatal编程技术网

C++ 返回MYSQL\u行的函数

C++ 返回MYSQL\u行的函数,c++,mysql,C++,Mysql,我在一个使用大量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_c

我在一个使用大量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;
}
int main( int argc, char* args[] ){
    MYSQL_ROW row = NULL;
    while (1) {
        row = function1();
        if(row != NULL) function2(row);
   }
}
main()
是一个无限循环,基本上如下所示:

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;
}
int main( int argc, char* args[] ){
    MYSQL_ROW row = NULL;
    while (1) {
        row = function1();
        if(row != NULL) function2(row);
   }
}
(变量和函数名已通用化,以保护无辜者)

但在第三次或第四次调用仅使用
进行读取的
函数2
后,
开始丢失其值,并出现segfault错误

有人知道为什么吗?我不确定这段代码中的全局变量数量是否合适,但我没有设计它,直到明天才能修复并完成它,所以欢迎使用变通方法


谢谢

在处理mysql\u fetch\u row返回的行时,不应关闭连接或释放结果集

更新:我误解了mysql结果的使用方式。它看起来像是
指针数组指向您在
function1()
中释放的结果数组,然后在返回堆后在
function2()
中使用它

您需要做的是在释放结果之前将
return_row[2]
复制到一个持久字符串中。然后将其传递给
function2()
。我看到您在
function2()
中做了类似的事情,因此您也需要在那里修复它(尽管在您的示例中,您没有对其返回值做任何操作)


另外,您认为
free(行)是正确的不是正确的做法。

为什么不给我们函数2()的代码?问题很可能就在这里。我在循环结束时尝试了free(row),但我猜这是非常错误的,对吗?Thanks@Gabe:请参阅上面的修订版。谢谢,但是
实际上有5个字段需要存储,以便执行其他操作。对不起,我没说清楚。它有5个字段,我可以毫无问题地存储字符串,但是如果我能够以某种方式将整个
mysql\u fetch\u行(resp)
结果复制并保存到
row
,那将是理想的
row
不是结果数据的副本。它只是指向现有结果数据的指针数组。如果您需要使用
resp
数据,请在使用完之后再释放它。即使我在关闭前将结果保存在变量中?因为这就是这里的意图。。。我不确定我做得对,不过。。。