c++ - 使用 Valgrind 检测内存泄漏

标签 c++ mysql valgrind

我正在用 C++ 编写一个守护进程,它有一个简单的任务,就是将一些事件插入到 mysql 数据库中。

当我运行 top 命令时,我看到进程的内存需要增加,我以为我有内存泄漏,于是我开始使用 Valgrind

我这样运行 valgrind:

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./my_app

我得到以下报告:

==17045== 128 bytes in 1 blocks are definitely lost in loss record 6 of 11
==17045==    at 0x402A629: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==17045==    by 0x40AAB63: my_thread_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
==17045==    by 0x40AAE43: my_thread_global_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
==17045==    by 0x40A92D7: my_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
==17045==    by 0x40863FA: mysql_server_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
==17045==    by 0x4087B28: mysql_init (in /usr/lib/i386-linux-gnu/libmysqlclient.so.18.0.0)
==17045==    by 0x8049890: write_db(std::string, std::string, std::string) (Listener.cpp:76)
==17045==    by 0x804A692: SocketListener(void*) (Listener.cpp:182)
==17045==    by 0x4052D4B: start_thread (pthread_create.c:308)
==17045==    by 0x4582D3D: clone (clone.S:130)

函数 write_db 是这样的:

void write_db(std::string userid,std::string zona,std::string eveniment)
{
    try
    {
    MYSQL * connect;
    connect = mysql_init(NULL);
    connect = mysql_real_connect(connect,"127.0.0.1","myusr","mypwd","mytbl",0,NULL,0);
    std::string stmt = "INSERT INTO t_evenimente(placaid,codev,zona,cand) VALUES(\"" + userid + "\"," + eveniment + ",\"" + zona + "\",NOW())";
    std::cout << stmt << std::endl;
    mysql_query(connect,stmt.c_str());
    mysql_close(connect);
    std::cout << "Inserat eveniment obiectiv " << userid << std::endl;
    }
    catch (...)
    {
        std::cout <<"Exceptie MYSQL" << std::endl;
    }
}

内存泄漏在哪里?我正在使用 mysql_init 并按照文档所述关闭...这可能是误报吗?

最佳答案

由于您仅在函数内部使用 connect,因此更容易不动态分配它并冒内存泄漏的风险(很可能是您所看到的)。此外,MySQL API 是一个 C API,不会抛出任何异常供您捕获,这将简化您现在拥有的东西;

void write_db(std::string userid,std::string zona,std::string eveniment)
{
    MYSQL connect;
    mysql_init(&connect);
    mysql_real_connect(&connect,"127.0.0.1","myusr","mypwd","mytbl",0,NULL,0);
    std::string stmt = "INSERT INTO t_evenimente(placaid,codev,zona,cand) VALUES(\"" + userid + "\"," + eveniment + ",\"" + zona + "\",NOW())";
    std::cout << stmt << std::endl;
    mysql_query(&connect,stmt.c_str());
    mysql_close(&connect);
    std::cout << "Inserat eveniment obiectiv " << userid << std::endl;
}

当然,这仍然遗漏了错误处理,您需要将其添加回去。

关于c++ - 使用 Valgrind 检测内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14724015/

相关文章:

c++ - Node js 我可以从用 C++ 编写的 Windows 命令行应用程序中获取退出代码吗?

linux - alsa - 内存泄漏?

mysql - MySQL session 的调用图

mysql - 如果字符串包含mysql中的子字符串,则从字符串中获取子字符串

c - 使用 glib 数据类型时,Valgrind 报告内存 'possibly lost'

C++ Eigen Vector 在编译时推断类的 vector 大小

c++ - shared_ptr 到可变长度结构

c# - c、c#、c++中的霍夫椭圆,或者wiki上matlab代码的实现

mysql - 当 FK 引用它时,如何将 PRIMARY KEY 更改为 UNIQUE KEY

php - Mysql查询总是返回零