ここで愚かな質問が来ます。libpq
のPQerrorMessage
関数は a を返しますchar const*
char const* msg = PQerrorMessage(conn);
今ではそれconst
が . では、いつ、どのように解放されるのでしょうか。msg
ポインターの使用が終了したことをどのように知ることができますか?
最初は、別のエラーメッセージが要求されると割り当てが解除されると思っていましたが、そうではありません。
// cause some error
char const* msg1 = PQerrorMessage(pgconn);
// cause another error
char const* msg2 = PQerrorMessage(pgconn);
// still works
std::cout << msg1 << msg2 << std::endl;
誰かが私のためにこれに光を当てることができますか?
編集:ドミトリー・イグリシンの功績
postgresqlメーリングリストでこれを尋ねたところ、最初の仮定が正しかったことがわかりました。
ポインターは有効ではなかったmsg1
はずで、どういうわけかラッキーでした。
編集: postgresqlドキュメントから
PQエラーメッセージ
接続の操作によって最後に生成されたエラー メッセージを返します。
char *PQerrorMessage(const PGconn *conn);
ほとんどすべての libpq 関数は
PQerrorMessage
、失敗した場合にメッセージを設定します。libpq の規則により、空でないPQerrorMessage
結果は複数の行で構成され、末尾に改行が含まれることに注意してください。呼び出し元は結果を直接解放しないでください。PGconn
関連付けられたハンドルが に渡されると解放されPQfinish
ます。PGconn
結果の文字列は、構造に対する操作全体で同じままになるとは考えられません。