我在代码中遇到内存泄漏问题,当它运行时,堆继续增加到最大值,我需要重新启动服务,我运行top命令,看到堆正在增加,只要我在服务中调用一个场景.
我用valgrind运行服务,
valgrind --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice
Run Code Online (Sandbox Code Playgroud)
当我运行场景时,我没有看到任何明显丢失或可能丢失的块,但我看到很多条件跳转或移动取决于未初始化的值(s)错误.
这些是否会导致内存泄漏?
我得到的例子:
==27278== Conditional jump or move depends on uninitialised value(s)
==27278== at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)
Run Code Online (Sandbox Code Playgroud)
........
==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)
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗
我试图查看导致内存泄漏的进程,并转储导致它看到问题的堆.
我在gdb中使用哪个命令来设置内存泄漏并检查堆?
我试过了:
(gdb) check -leaks
checkpoint: can't find fork function in inferior.
(gdb) help info heap
Undefined info command: "heap". Try "help info".
(gdb) help info leaks
Undefined info command: "leaks". Try "help info".
Run Code Online (Sandbox Code Playgroud) 我在类,嵌套类中有一个类
class A {
public:
int a;
int b;
class B {
int c;
int d;
}
}
Run Code Online (Sandbox Code Playgroud)
在这个过程中,我在堆中分配了B类的对象指针.
B *bobj = new B();
A *a;
auto_ptr<A> A1(new A());
a = A1.release();
Run Code Online (Sandbox Code Playgroud)
删除a,删除bobj也是?
delete a;
Run Code Online (Sandbox Code Playgroud)
还是我们应该明确删除子类指针?
这是在我不写的代码中,我把日志放在所有的alloc和deallocs上,我看到B *bobj = new B(),为此没有删除,对于A的对象ptr,有一个删除.然而,没有内存泄漏.这就是为什么我怀疑在这种情况下会发生什么.