10

我在代码中面临内存泄漏问题,当它运行时,堆继续增加到最大值,我需要重新启动服务,我运行 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)

有人可以帮忙吗。

4

3 回答 3

16

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

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) 字节不会被初始化
于 2013-02-19T08:07:43.043 回答
5

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

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

...

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

于 2013-02-19T08:09:14.577 回答
2

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

于 2013-02-19T08:08:22.363 回答