[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 メーリングリストの案内