valgrind条件跳转或移动取决于未初始化的值,这是否表示内存泄漏?

use*_*833 7 c c++ valgrind

我在代码中遇到内存泄漏问题,当它运行时,堆继续增加到最大值,我需要重新启动服务,我运行top命令,看到堆正在增加,只要我在服务中调用一个场景.

我用valgrind运行服务,

valgrind  --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice
Run Code Online (Sandbox Code Playgroud)

当我运行场景时,我没有看到任何明显丢失或可能丢失的块,但我看到很多条件跳转或移动取决于未初始化的值(s)错误.

这些是否会导致内存泄漏?

我得到的例子:

==27278== Conditional jump or move depends on uninitialised value(s)

==27278==    at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)
Run Code Online (Sandbox Code Playgroud)

........

==27278==  Uninitialised value was created by a heap allocation

==27278==    at 0x4A078B8: malloc (vg_replace_malloc.c:270)

==27278==    by 0xC90E32F: xcsGetMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗

seh*_*ehe 15

不,这意味着您正在访问尚未初始化的内存:

int main()
{
     int unitialized;
     std::cout << unitialized << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

会触发这个错误.

稍微更常见的是:

struct X 
{
     X() : i(42) { }
  private:
     int i;
     int* forgotten; // oops, not initialized
};
Run Code Online (Sandbox Code Playgroud)

最后,当您不使用memset清除整个缓冲区时,基于malloc的代码经常发生这种情况.所以,

  1. malloc缓冲区大小m
  2. 读取(例如从套接字)n个字节
  3. 将m个字节写入文件; (mn)字节不会被初始化


log*_*off 5

Valgrind 用户手册的4.2.2节对此进行了解释使用未初始化的值

当您的程序使用尚未初始化的值时,会报告未初始化值使用错误——换句话说,未定义。

...

重要的是要了解您的程序可以随心所欲地复制垃圾(未初始化)数据。Memcheck 观察到这一点并跟踪数据,但没有抱怨。只有当您的程序试图以可能影响您程序的外部可见行为的方式使用未初始化的数据时,才会发出投诉。