最近,我编写了一个通过libpqxx访问Postgres DB的应用程序,它严重泄漏了内存。即使是基于http://pqxx.org/devprojects/libpqxx/doc/4.0/html/Reference/a00001.html的示例的简单测试程序,也一样会泄漏。

(编辑:为了响应建议,我添加了对commit()和clear()的调用。同样的泄漏。)

#include <iostream>
#include <pqxx/pqxx>
#include <string>
#include <stdio.h>

int main()
{
    try
    {
        pqxx::connection c("user=postgres");

        int i = 0;
        while(true)
        {
            pqxx::work w(c);
            pqxx::result r = w.exec("SELECT 1");
            w.commit();

            i++;
            if ( i % 1000 == 0 )
                printf( "Cycle %d\n", i );

            r.clear();
        } //while
    } //try
    catch (const std::exception &e)
    {
        std::cerr << e.what() << std::endl;
        return 1;
    } //catch
} //main

在大约75,000个循环周期后,顶部显示206Mb的虚拟内存使用率,并且一直在上升。我通过valgrind运行了一个具有5000个周期的类似测试程序,并得到了以下信息:
==1647== 13,732,155 (219,868 direct, 13,512,287 indirect) bytes in 4,997 blocks are definitely lost in loss record 12 of 12
==1647==    at 0x40060D5: operator new(unsigned int) (vg_replace_malloc.c:214)
==1647==    by 0x404C0A9: pqxx::result::result(pg_result*, int, std::string const&, int) (in /usr/lib/libpqxx-4.0.so)
==1647==    by 0x40309EF: pqxx::connection_base::make_result(pg_result*, std::string const&) (in /usr/lib/libpqxx-4.0.so)
==1647==    by 0x4036D65: ??? (in /usr/lib/libpqxx-4.0.so)
==1647==    by 0x405EFD6: pqxx::transaction_base::DirectExec(char const*, int) (in /usr/lib/libpqxx-4.0.so)
==1647==    by 0x40416EA: pqxx::dbtransaction::do_exec(char const*) (in /usr/lib/libpqxx-4.0.so)
==1647==    by 0x40618FA: pqxx::transaction_base::exec(std::string const&, std::string const&) (in /usr/lib/libpqxx-4.0.so)
==1647==    by 0x80498F8: main (dbtest.cpp:21)

知道发生了什么吗?很难接受像libpqxx这样的广泛使用的库会出现如此严重的错误,所以在这里我可能会做错什么呢?

配置详细信息:
  • 操作系统:Linux 2.6.18-238.el5
  • gcc版本4.4.0
  • libpqxx 4.0
  • postgres 9.2

  • (最终编辑:我发现用libpq替换libpqxx比继续调查此内存泄漏更容易。)

    最佳答案

    我无法重现您的问题。

    libpqxx-2.6.9和libpqxx-4.0.1(当前为当前稳定版本)均不可用。

  • Debian Linux 2.6.32
  • gcc版本4.4.5
  • libpq5 8.4.17
  • libpqxx 4.0.1
  • libstdc++ 6.4.4
  • postgres 8.4

  • 内存使用率是恒定的。



    我会检查您使用的库的不同安装是否存在问题。例如,是否链接到libpqxx-4.0,但是稍后,当您运行该程序时,您使用的是其他版本。



    当我手动下载并安装libpqxx-4.0.1时,我必须显式设置LD_LIBRARY_PATH,因为我没有在/usr/local/下方安装它。如果/usr/local中安装了不同的版本,则应在此之前进行清理。

    在您的情况下(使用ldd),libpqxx应该指向您已编译和安装的版本。确保系统上仅安装了一个libpqxx。

    我用了这个Makefile


    和libpqxx已经用



    我已经使用运行了程序

    08-26 20:16