0

使用 MySQL Connector C++ 1.05 时出现内存泄漏/删除错误。

连接器从执行查询返回一个指向结果集的指针。

我将指针分配给boost::shared_ptr. 调用看起来像:

std::string query_text;
query_text = /* ... */;
boost::shared_ptr<sql::Statement> query(p_db_connection->createStatement());
if (!query)
{
    return;
}
boost::shared_ptr<sql::ResultSet>  query_results(query->executeQuery(query_text));
if (!query_results->next())
{
    return;
}

以下是我的问题:

  1. 谁负责删除分配的结果集?
  2. 我应该使用scoped_ptr还是 shared_ptr只在函数中使用结果?
  3. 执行另一个查询时结果是否有效?

我正在使用 MySQL 连接器 C++ 1.05、MS Visual Studio 2008 版本 9.0。

4

1 回答 1

1

1)根据这个例子,你做的一切都是正确的。

如果您使用shared_ptr<X>来存储结果,它将在您的shared_ptr对象超出范围(在您的情况下)/没有更多实际引用(全局发言)后自动处置。

2)这取决于,但最常见的做法是使用scoped_ptr,因为它的构造和内存释放要快得多,并且使用它明确声明,该对象仅对当前范围有效

3)我不确定我是否正确地回答了问题,但您可以.reset为您执行操作Results并用新的查询结果填充它。

另外,我确定您的泄漏来自分配在其他地方的内存(也可能在库中)。您可能不会删除与连接器相关的内容,请参阅文档。

于 2011-03-06T22:42:57.687 回答