Valgrind的条件跳转或移动依赖于未初始化值(S),这并不表示内存泄漏?(valgrind Co

2019-07-20 03:30发布

我对着在代码中的内存泄漏问题,而它的运行,堆继续增加至最大,我需要重新启动该服务,我跑靠前指挥,并看到,每当IM在服务调用的场景堆越来越大。

我跑的服务,Valgrind的,

valgrind  --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice

我DONOT看到任何绝对丢失或可能丢失盖帽,IAM运行的情况,但我看到了很多条件跳转或移动的依赖于未初始化的值(一个或多个)错误。

做这些计数内存泄漏?

什么我得到的实例:

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

==27278==    at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)

........

==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)

谁能帮。

Answer 1:

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

int main()
{
     int unitialized;
     std::cout << unitialized << std::endl;
}

会引发此错误。

稍微比较常见的是:

struct X 
{
     X() : i(42) { }
  private:
     int i;
     int* forgotten; // oops, not initialized
};

最后,这往往与基于malloc的代码发生了,当你不使用memset清除整个缓冲区。 所以,

  1. MALLOC缓冲器大小为m
  2. 读取(例如从插座)n个字节
  3. 写M个字节到文件; (MN)字节就不会被初始化


Answer 2:

它在Valgrind的用户手册说明,在第4.2.2。 未初始化值的用途 :

报道一个未初始化值的使用错误,当你的程序使用尚未初始化的值 - 换句话说,是不确定的。

...

要明白,你的程序可以围绕垃圾(未初始化)数据复制为多,因为它喜欢的是很重要的。 MEMCHECK观察这一点,并跟踪数据,但不抱怨。 投诉发出只有当你的程序试图使用未初始化的数据的一种方式,可能会影响你的程序的外部可见的行为。



Answer 3:

不,这并不直接表示内存泄漏。 但是具有取决于未初始化变量可能导致几乎任何一个条件跳转。 一般使用未初始化的变量调用未定义的行为。



文章来源: valgrind Conditional jump or move depends on uninitialised value(s) , does this indicate memory leak?
标签: c++ c valgrind