我在使用 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;
}
这是我的问题:
- 谁负责删除 分配的结果集?
- 我应该使用
scoped_ptr
还是shared_ptr
如果结果只是 在函数中使用? - 另一个结果是否有效 查询执行了吗?
我使用的是 MySQL Connector C++ 1.05,MS Visual Studio 2008 9.0 版。
最佳答案
1) 根据this例如,您所做的一切都是正确的。
如果您使用的是 shared_ptr<X>
存储结果,它会在你的 shared_ptr
之后自动处理。对象超出范围(在您的情况下)/没有更多实际引用(在全局范围内发言)。
2) 这取决于,但最常见的做法是使用 scoped_ptr
,因为它的构造和内存释放速度要快得多,并且使用它会明确声明,该对象仅对当前作用域有效。
3) 我不确定我是否正确回答了问题,但你可以做 .reset
为您采取行动Results
并用新的查询结果填充它。
此外,我确定您的泄漏来自分配在其他地方的内存(也可能在库中)。您可能不会删除与连接器相关的内容,请参阅文档。
关于c++ - 谁拥有 MySQL Connector C++ 返回的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213388/