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

时间:2013-02-19 08:05:44

标签: c++ c valgrind

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

我用valgrind运行服务,

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

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

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

我得到的例子:

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

有人可以提供帮助。

3 个答案:

答案 0 :(得分:15)

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

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

会触发此错误。

稍微会更常见的是:

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

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

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

答案 1 :(得分:4)

在Valgrind用户手册的4.2.2. Use of uninitialised values部分

中对此进行了解释
  

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

     

...

     

了解您的程序可以复制很重要   垃圾(未初始化)数据尽可能多。 Memcheck观察到了这一点   并跟踪数据,但不抱怨。投诉是   仅在您的程序尝试使用未初始化时才发出   数据可能会影响程序的外部可见性   行为。

答案 2 :(得分:1)

否这不表示内存直接泄漏。但是,根据非初始化变量进行条件跳转可能会导致几乎任何事情。一般使用未初始化的变量会调用未定义的行为。