谁拥有 MySQL Connector C++ 返回的内存?
我在使用 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。
I'm having memory leak / deleting errors when using MySQL Connector C++ 1.05.
The Connector returns a pointer to a result set from executing query.
I am assigning the pointer to a boost::shared_ptr
. The call looks like:
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;
}
Here are my questions:
- Who is responsible for deleting the
allocated result set? - Should I be using
scoped_ptr
orshared_ptr
if the results are only
used within the function? - Is the result valid when another
query is executed?
I'm using MySQL Connector C++ 1.05, MS Visual Studio 2008 version 9.0.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
1)根据这个示例,你做的一切都是正确的。
如果您使用
shared_ptr
来存储结果,则在您的shared_ptr
对象超出范围(在您的情况下)/具有不再有实际参考(全球范围内)。2) 这取决于情况,但最常见的做法是使用
scoped_ptr
,因为它的构造和内存释放要快得多,并且使用它显式声明,该对象对于当前作用域有效仅。3) 我不确定我是否正确理解了问题,但您可以对
Results
执行.reset
操作,并用新的查询结果填充它。另外,我确信您的泄漏是来自分配在其他地方的内存(也可能在库中)。您可能不会删除与连接器相关的内容,请参阅文档。
1) According to this example, you're doing everything correct.
If you're using the
shared_ptr<X>
to store the result, it would be automatically disposed after yourshared_ptr
object goes out of the scope (in your case) / has no more actual references (speaking globally).2) It depends, but the most common practice is to use the
scoped_ptr
, because it's contruction and memory deallocation is much faster and using it explicitly states, that the object is valid for the current scope only.3) I am not sure I get the question correctly, but you could do
.reset
action for yourResults
and fill it with the new query result.Also, I'm sure that your leaks are from memory allocated somewhere else (could be in the library too). You might not be deleting something connector-related, see the docs.