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)
有人可以帮忙吗
不,这意味着您正在访问尚未初始化的内存:
int main() { int unitialized; std::cout << unitialized << std::endl; }
会触发这个错误。
稍微更常见的是:
struct X { X() : i(42) { } private: int i; int* forgotten; // oops, not initialized };
最后,当您不使用memset
清除整个缓冲区时,基于malloc的代码经常会发生这种情况。 所以,
- malloc缓冲区大小m
- 读取(例如从套接字)n个字节
- 将m个字节写入文件; (mn)字节不会被初始化
在Valgrind用户手册的4.2.2节中对此进行了解释。 使用未初始化的值 :
当程序使用尚未初始化的值时,会报告未初始化的值使用错误 – 换句话说,未定义。
…
重要的是要了解您的程序可以根据需要复制垃圾(未初始化)数据。 Memcheck观察到这一点并跟踪数据,但不抱怨。 只有当您的程序试图以可能影响程序外部可见行为的方式使用未初始化数据时,才会发出投诉。
不,这并不表示内存直接泄漏。 但是,根据非初始化变量进行条件跳转可能会导致几乎任何事情。 一般使用未初始化的变量会调用未定义的行为。