[pgsql-jp: 35638] Re: libpq ライブラリを用いた SQL 実行結果ポインタのクリアタイミング
J.SHIRA
jshira @ rio.odn.ne.jp
2005年 6月 30日 (木) 18:20:49 JST
白澤と申します。
以下は 堀越 <horihorikoshi @ yahoo.co.jp>さんの
<20050630073508.68015.qmail @ web2706.mail.mci.yahoo.co.jp> より一部引用してい ..
horihorikoshi> 現在、DBアクセスクラスのデストラクタにて
horihorikoshi> PGresultポインタ(クラスメンバ)をクリア
horihorikoshi> (PQclear)しております。そして、複数のSQLの
horihorikoshi> 実行結果を同じPGresultポインタに格納して使い
horihorikoshi> まわして、オブジェクトの破棄のタイミングでク
horihorikoshi> リアしている状態ですが、このように使用しても
horihorikoshi> メモリリークは起こさないのでしょうか?
horihorikoshi>
horihorikoshi> マニュアルによると、複数SQLの実行結果を
horihorikoshi> PGresultポインタに格納したときは、「最後に実
horihorikoshi> 行されたコマンドの結果のみが含まれる」、との
horihorikoshi> 記述があったので大丈夫だとは思っていますが、
horihorikoshi> みなさんのご意見を是非お聞かせ下さい。
で、マニュアルによれば、明示的にクリアしない限り PGResult に
割り当てられた領域は解放されないはずです。
http://www.postgresql.org/docs/8.0/interactive/libpq-exec.html
の 27.3. Command Execution Functions には、「各々のコマンド
の実行結果は、必要がなくなり次第、PQclearを用いて解放するべ
きである。PGResultオブジェクトは必要なだけ保持しておくことが
出来るが、新しいコマンドを発行しても、接続を閉じてしまった時
でさえも、勝手に解放はされない。解放するためには、PQclear を
呼出さなければならない。この操作に失敗すると、アプリケーショ
ンはメモリリークを引き起こす」とあります。
私も以前 libpq をラップしたクラスを作成したことがありますが、
その時も新しいクエリを発行するたびに直前のクエリの結果
(PGResult)をPQclear()にて開放していました。一番最後のクエリ
の結果だけ、デストラクタ中で解放するようにしてました。
参考になれば幸いです。
/* SHIRASAWA, Jun.
<jshira @ rio.odn.ne.jp> */
pgsql-jp メーリングリストの案内