0

这段代码看起来像是使用了所有系统内存。为什么会这样?

sql::Statement *Query;
sql::ResulSet *Result;
while(1){
   Query = con->createStatement();
   Result = Query->executeQuery("SELECT `Some` FROM `Table` LIMIT 1");
   Result->next();
   Result->close(); 
   Query->close();
   cout << "console message..." << endl;
   //delete Query; SEGFAULT
}

如果我评论除 cout 之外的所有行,则内存不会被填满。但是使用 SQL 看起来像 Query = con->createStatement; 没有替换旧的 Query 值和 Result = bla; 没有替换旧值

4

2 回答 2

2

createStatement()并且executeQuery正在创建新对象(这是您存储在Query和中的对象Result。除非您明确删除它们,否则它们将保留在内存中。

添加

  delete Result;
  delete Query;

到你的循环。

顺便说一句,这在连接器文档中(连同示例代码)。

于 2013-09-29T10:51:49.243 回答
0

好吧,看起来谷歌上没有信息。我发现了问题所在。

正如 SJuan76 所说,每次调用 createStatement 和 executeQuery 都是一个新对象

所以我开始做很多尝试,我想出了以下几点

  1. 只使用一次 createStatement
  2. 在删除结果之前检查它是否打开和关闭
  3. 删除 Respuesta
  4. 只在程序 auto_ptr 末尾删除 con 和 Query(有时是你的朋友)

因此,让“永远运行”程序始终使用相同内存的代码应该如下所示

sql::Statement *Query;
sql::ResulSet *Result;
Query = con->createStatement();
while(1){
 if(!Result->isClosed()) Result->close();
 delete Result;
 Result = Query->executeQuery("SELECT `Some` FROM `Table` LIMIT 1");
 Result->next();
 cout << "console message..." << endl;
}
于 2013-09-29T12:27:45.870 回答