- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近我编写了一个通过 libpqxx 访问 Postgres 数据库的应用程序,它严重泄漏了内存。即使是这个基于 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 次循环后,top 显示 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 这样广泛使用的库会有如此严重的错误,那么我在这里做错了什么?
配置详情:
(最终编辑:我发现用 libpq 替换 libpqxx 比继续调查此内存泄漏更容易。)
最佳答案
我无法重现您的问题。
既没有使用 libpqxx-2.6.9,也没有使用 libpqxx-4.0.1(此时是当前的稳定版本)。
内存使用量是恒定的。
$ valgrind --tool=memcheck run.sh
[...]
Cycle 35000
Cycle 36000
^C==18420==
==18420== HEAP SUMMARY:
==18420== in use at exit: 0 bytes in 0 blocks
==18420== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==18420==
==18420== All heap blocks were freed -- no leaks are possible
我会检查一下,如果您对正在使用的库的不同安装有问题。例如,您是否链接了 libpqxx-4.0,但稍后,当您运行该程序时,您使用的是不同的版本。
$ ldd client
linux-gate.so.1 => (0xb7776000)
libpqxx-4.0.so => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7669000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb764a000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7503000) libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb74ea000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb74c4000)
/lib/ld-linux.so.2 (0xb7777000)
因为我已经手动下载并安装了 libpqxx-4.0.1,所以我必须明确设置 LD_LIBRARY_PATH
,因为我没有将它安装在 /usr/local/
下。如果/usr/local
安装了不同的版本,你应该先清理那里。
在您的情况下(使用 ldd
)libpqxx 应该指向您已编译和安装的版本。确保您的系统上只安装了一个 libpqxx。
我使用了这个Makefile
CPPFLAGS += -I/home/dev/data/src/cpp/libpqxx-4.0.1/install/include
LDFLAGS += -L/home/dev/data/src/cpp/libpqxx-4.0.1/install/lib -lpqxx -lstdc++client: client.o
并且 libpqxx 是用
构建的./configure --prefix=/home/dev/data/src/cpp/libpqxx-4.0.1/install --enable-shared
make
make install
我已经使用
运行程序LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dev/data/src/cpp/libpqxx-4.0.1/install/lib client
关于c++ - 为什么这个简单的 libpqxx 代码会泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17432242/
我正在处理我的 C++ 简单项目,我在 CMakelists.txt 中遇到了一个关键问题,我无法以错误的方式链接 libpqxx 库,我花了两天时间解决了这个问题。 我正在使用 C++ 2017,
要在 PostgreSQL 中插入批量数据/填充数据库,最快的方法是使用 COPY。 Source 我必须填充一个数据库。现在,我的写入速度低至每秒 100-200。这涉及通过 C++ 库 libpq
是否可以执行包含多个查询的一个事务,例如在表 1 中插入 smth 并在表 2 中插入 smth?我该如何实现?我使用 libpqxx 与数据库进行交互,并期待与此相关的答案。谢谢。 最佳答案 pqx
对于我的实现,特定的写入必须批量完成并且没有其他干扰的机会。 我已经told以这种方式进行的两个竞争事务将导致第一个阻塞第二个,第二个可能会在第一个完成后完成,也可能不会完成。 请发布确认这一点的文档
我将通过 libpqxx 和 C++ 创建到 Postgresql 数据库的连接,然后执行几个准备好的语句,返回结果(我将循环遍历它们)。我来自 Java 背景,过程是: 打开数据库连接 准备报表 调
我正在尝试使用 libpqxx 库开发一个非常简单直接的连接池。我是 c++ 的新手,对指针和引用仍然很困惑。该类的行为非常简单:有一个带有一些初始化连接的 vector ,并在需要时将连接弹出和推送
所以我有以下问题: g++ -std=c++0x -O3 -I/usr/include/scip main.cpp locations/locationreader.cpp locations/loc
我正在使用 libpqxx 从数据库中获取一行并将 pqxx::row 中的字段分配给专门设计用于保存这些值的结构: struct driveOperationRecord { long in
我正在尝试编译 libpqxx 代码示例: #include #include int main(int, char *argv[]) { pqxx::connection c("dbname
如何使用 libpqxx 从数组中获取值?例如我有这样的表: CREATE TABLE testTable ( testArray integer[] ); 如何在 C++ 中获取具有这些值的 in
最近我编写了一个通过 libpqxx 访问 Postgres 数据库的应用程序,它严重泄漏了内存。即使是这个基于 http://pqxx.org/devprojects/libpqxx/doc/4.0
我正在尝试使用 libpqxx 来监听通知事件.我从一个扩展 pqxx::notify_listener 的例子开始。 #include #include #include class Foo
我在我的项目中使用 libpqxx。项目比较具体,不知道会执行什么SQL语句。让我们说用户输入语句: SELECT * FROM table1 执行该语句我得到结果记录并且我可以遍历它。 for( a
我正在编写一个 C++ 客户端程序,通过互联网查询 postgreSQL 数据库。我想在等待答案时处理事件,发生网络连接问题,因此客户端无法从数据库服务器接收任何消息。但是当我手动关闭互联网连接时,即
我必须通过以下代码对 Postgres 执行 SQL 查询。查询返回大量行(40M 或更多)并有 4 个整数字段:当我使用 32Gb 的工作站时,一切正常,但在 16Gb 的工作站上,查询非常慢(我猜
我需要使用 libpqxx 将大量数据(大约 7.000.000 个条目)批量加载到 PostgreSQL 数据库中.我已阅读有关 how to populate the database 的文档,但
我有一个非常简单的例子,但无法正确构建它,我使用了下一个参数: g++ -lpq -libpqxx -Wall -o "pg" "pg.cpp" (in dir: /home/user) /usr/l
我有一个使用 libpqxx 的 MFC 项目。所有设置均为默认设置。 Release模式如我所料正常工作。但是当我切换到 Debug模式时,它显示异常并显示调试断言: 最有趣的是,如果我使用 Sha
我刚刚开始为 PostgreSQL 数据库实现一些客户端软件。 查询将允许来自不受信任来源的输入参数。因此,我需要在实际提交之前清理我的交易。 至于 libpq,我找到了 PQescapeString
我想尽快在 postgres 表中插入许多参数。 现在我浪费了太多时间来一个一个地绑定(bind)参数。代码看起来几乎像这样: pqxx::connection my_connection(c_str
我是一名优秀的程序员,十分优秀!