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 Connector C ++ 1.05、MS VisualStudio2008バージョン9.0を使用しています。

4

1 に答える 1

1

1)この例によると、あなたはすべて正しいことをしています。

結果を保存するためにを使用している場合、オブジェクトがスコープ外になった後 (あなたの場合)/実際の参照がなくなった後 (グローバルに言えば)、shared_ptr<X>自動的に破棄されます。shared_ptr

2) 場合によって異なりますが、最も一般的な方法は を使用するscoped_ptrことです。これは、構造とメモリの割り当て解除がはるかに高速であり、それを使用すると、オブジェクトが現在のスコープに対してのみ有効であることが明示的に示されているためです。

3) 質問が正しく得られたかどうかはわかりませんが、.resetアクションをResults実行して、新しいクエリ結果を入力してください。

また、リークは別の場所に割り当てられたメモリからのものであると確信しています(ライブラリにもある可能性があります)。コネクタ関連のものを削除していない可能性があります。ドキュメントを参照してください。

于 2011-03-06T22:42:57.687 に答える