2013-02-19 36 views
7

我正在面对代码中的内存泄漏问题,而它的运行时,堆增加到最大,我需要重新启动服务,我运行了顶层命令,并看到堆正在增加,每当我调用场景中的服务。valgrind条件跳转或移动取决于未初始化的值,这是否表示内存泄漏?

我跑了Valgrind的服务,

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

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

做这些计算内存泄漏?我所得到的

例子:

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

谁能帮。

+0

您是否找到了正确的答案?如果是,请标出一个正确的。 – logoff 2013-02-20 08:03:22

+0

[精确定位]条件跳转或移动的可能重复取决于未初始化的值“valgrind消息”(http://stackoverflow.com/questions/2612447/pinpointing-conditional-jump-or-move-depends-on-uninitialized -values-valgrin) – 2015-02-20 15:45:07

回答

15

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

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个字节到文件; (M-N)个字节就不会被初始化
+0

我同意这并不表示内存泄漏,但因为它调用未定义的行为,可能导致任何事情 – 2013-02-19 08:09:22

1

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

+2

在C中,使用未初始化的对象本身并不是未定义的行为。如果对象“可能已经用”register“声明了,那就是UB,如果它的地址永远不会被使用的话。通过指针读取未初始化的内存非常好(从POV开始)。这是Valgrind正确地抱怨的价值观的分支。 – 2013-02-19 08:19:41

4

它在Valgrind的用户手册说明,在第4.2.2. Use of uninitialised values

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

...

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

相关问题