2

libpqxx と C++ を介して Postgresql データベースへの接続を作成し、いくつかの準備済みステートメントを実行して、結果を返します (そして、それらをループします)。私はJavaのバックグラウンドを持っており、プロセスは次のとおりです。

  1. データベース接続を開く
  2. 声明を準備する
  3. 準備済みステートメントのパラメーターを調整する
  4. ステートメントを実行する
  5. 結果セットをループする
  6. 結果セットを閉じる
  7. 準備されたステートメントを閉じる
  8. データベース接続を閉じる

1~5と8のサンプルコードはあるのですが、結果オブジェクトと準備文オブジェクトを閉じる方法がわかりません

サンプルコード:

connection C("dbname=mydbname user=postgres password=mypass hostaddr=127.0.0.1 port=5432");
string tableName("mydbtable");
if (C.is_open()) {
    cout << "We are connected to " << C.dbname() << endl;
} else {
    cout << "We are not connected!" << endl;
}

result r;
try {
    const std::string sql =
            "SELECT * FROM " + tableName + " WHERE sn_autoinc10 = $1";
    C.prepare("find", sql);
    //C.prepare("findtable", ) ("integer");
    work W(C);
    r = W.prepared("find")(0).exec();
    for (int rownum = 0; rownum < r.size(); ++rownum) {
        const result::tuple row = r[rownum];
        for (int colnum = 0; colnum < row.size(); ++colnum) {
            const result::field myField = row[colnum];
            std::cout << myField.c_str() << ' ';
        }
        std::cout << std::endl;
    }
    C.disconnect();
} catch (const std::exception &e) {
    std::cerr << e.what() << std::endl;
}

メモリ リークを回避するために、c++ と libpqxx を使用して結果と準備済みステートメントを明示的に閉じる必要がありますか? 前もって感謝します

4

1 に答える 1

2

トランザクション オブジェクトと結果オブジェクトは、削除されると自動的に消去されます。つまり、スコープ外に出ると消去されます。

あなたのコードはメモリをリークしませんが、完璧ではありません:

  • r変数を再利用しないでください。tryブロック内で結果オブジェクトを宣言する方がよいため、不要になったらすぐにクリアされます。
  • ブロックC.disconnect()内で呼び出すべきではありません-スコープ外に出るのを許可する方が良いです。tryC

C++ では、必要最小限のスコープ外で変数を宣言することは想定されていません。これはコンパイラーに最適化してもらいます。

于 2013-01-28T23:25:57.523 に答える