libpqxx关闭准备好的报表和结果

时间:2013-01-28 12:54:51

标签: c++ postgresql libpqxx

我将通过libpqxx和C ++创建与Postgresql数据库的连接,然后执行几个准备好的语句,这些语句返回结果(我将遍历它们)。我来自Java背景,过程是:

  1. 打开数据库连接
  2. 准备陈述
  3. 调整预备语句params
  4. 执行陈述
  5. 循环结果集
  6. close resultset
  7. 关闭准备好的陈述
  8. 关闭数据库连接
  9. 我有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显式关闭结果和预处理语句以避免内存泄漏?提前致谢

1 个答案:

答案 0 :(得分:2)

事务和结果对象在被删除时会自动清除,这意味着当它们超出范围时会被清除。

所以你的代码不会泄漏内存,但它不是完美的

  • 你不应该重用r变量 - 最好在try块中声明结果对象,因此一旦不需要它就会被清除;
  • 你不应该在C.disconnect()块内调用try - 最好只允许C超出范围。

在C ++中,你不应该在最小需要范围之外声明变量 - 让编译器为你优化这个。