C++ 试图理解valgrind的输出

C++ 试图理解valgrind的输出,c++,qt,valgrind,C++,Qt,Valgrind,这是valgrind的输出 Conditional jump or move depends on uninitialised value(s) in RingsWidget::UpdateSeekBar() in ringswidget.cpp:514 1: RingsWidget::UpdateSeekBar() in <a href="file:///media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug

这是valgrind的输出

Conditional jump or move depends on uninitialised value(s)
in RingsWidget::UpdateSeekBar() in ringswidget.cpp:514
1: RingsWidget::UpdateSeekBar() in <a href="file:///media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug/../NomadDesktop/ringswidget.cpp:514" >ringswidget.cpp:514</a>
2: RingsWidget::UpdateRings() in <a href="file:///media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug/../NomadDesktop/ringswidget.cpp:138" >ringswidget.cpp:138</a>
3: RingsWidget::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) in <a href="file:///media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug/moc_ringswidget.cpp:49" >/media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug/moc_ringswidget.cpp:49</a>
4: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) in /usr/lib/libQtCore.so.4.8.4
5: QObject::event(QEvent*) in /usr/lib/libQtCore.so.4.8.4
6: QApplicationPrivate::notify_helper(QObject*, QEvent*) in /usr/lib/libQtGui.so.4.8.4
7: QApplication::notify(QObject*, QEvent*) in /usr/lib/libQtGui.so.4.8.4
8: QCoreApplication::notifyInternal(QObject*, QEvent*) in /usr/lib/libQtCore.so.4.8.4
9: /usr/lib/libQtCore.so.4.8.4
10: /usr/lib/libQtCore.so.4.8.4
11: g_main_context_dispatch in /usr/lib/libglib-2.0.so.0.3400.3
12: /usr/lib/libglib-2.0.so.0.3400.3
13: g_main_context_iteration in /usr/lib/libglib-2.0.so.0.3400.3
14: QEventDispatcherGlib::processEvents(QFlags&lt;QEventLoop::ProcessEventsFlag&gt;) in /usr/lib/libQtCore.so.4.8.4
15: /usr/lib/libQtGui.so.4.8.4
16: QEventLoop::processEvents(QFlags&lt;QEventLoop::ProcessEventsFlag&gt;) in /usr/lib/libQtCore.so.4.8.4
17: QEventLoop::exec(QFlags&lt;QEventLoop::ProcessEventsFlag&gt;) in /usr/lib/libQtCore.so.4.8.4
18: QCoreApplication::exec() in /usr/lib/libQtCore.so.4.8.4
19: main in <a href="file:///media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug/../NomadDesktop/main.cpp:19" >main.cpp:19</a>

Uninitialised value was created by a heap allocation  1: operator new(unsigned long) in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
2: MusicWidget::MusicWidget(QWidget*) in <a href="file:///media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug/../NomadDesktop/musicwidget.cpp:148" >musicwidget.cpp:148</a>
3: NomadWindow::Initialize() in <a href="file:///media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug/../NomadDesktop/nomadwindow.cpp:127" >nomadwindow.cpp:127</a>
4: NomadWindow::NomadWindow(QWidget*) in <a href="file:///media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug/../NomadDesktop/nomadwindow.cpp:27" >nomadwindow.cpp:27</a>
5: main in <a href="file:///media/dipesh/Documents/Qt-projects/NomadDesktop-build-Desktop-Debug/../NomadDesktop/main.cpp:15" >main.cpp:15</a>
条件跳转或移动取决于未初始化的值
在RingsWidget.cpp:514中的RingsWidget::UpdateSeekBar()中
1:RingsWidget::UpdateSeekBar()在中
中的2:RingsWidget::UpdateRings()
3:RingsWidget::qt_static_metacall(QObject*,QMetaObject::Call,int,void**)在
4:QMetaObject::在/usr/lib/libQtCore.so.4.8.4中激活(QObject*,QMetaObject const*,int,void**)
5:QObject::event(QEvent*)位于/usr/lib/libQtCore.so.4.8.4中
6:QApplicationPrivate::notify_helper(QObject*,QEvent*)在/usr/lib/libQtGui.so.4.8.4中
7:QApplication::notify(QObject*,QEvent*)位于/usr/lib/libQtGui.so.4.8.4中
8:QCoreApplication::notifyInternal(QObject*,QEvent*)位于/usr/lib/libQtCore.so.4.8.4中
9:/usr/lib/libQtCore.so.4.8.4
10:/usr/lib/libQtCore.so.4.8.4
11:g_main_context_dispatch in/usr/lib/libglib-2.0.so.0.3400.3
12:/usr/lib/libglib-2.0.so.0.3400.3
13:g_main_context_迭代在/usr/lib/libglib-2.0.so.0.3400.3中
14:QEventDispatcherGlib::processEvents(QFlagsQEventLoop::ProcessEventsFlag)在/usr/lib/libQtCore.so.4.8.4中
15:/usr/lib/libQtGui.so.4.8.4
16:QEventLoop::processEvents(QFlagsQEventLoop::ProcessEventsFlag)位于/usr/lib/libQtCore.so.4.8.4中
17:QEventLoop::exec(QFlagsQEventLoop::ProcessEventsFlag)在/usr/lib/libQtCore.so.4.8.4中
18:QCoreApplication::exec()位于/usr/lib/libQtCore.so.4.8.4中
19:主要在
未初始化的值是由/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中的堆分配1:operator new(unsigned long)创建的
2:MusicWidget::中的MusicWidget(QWidget*)
3:NomadWindow::中的Initialize()
4:NomadWindow::中的NomadWindow(QWidget*)
5:主要在
这是密码

511 NomadWindow *par = (NomadWindow*)parent();
512 float percentage = par->GetMusicWidget()->GetMPDSeekPerc();
513 settings[5].operator []("value") = percentage;
514 if ( percentage < 0.2 )
515     settings[5].operator []("fg_alpha") = 0.2;
516 else
517     settings[5].operator []("fg_alpha") = percentage;
511 NomadWindow*par=(NomadWindow*)父项();
512浮动百分比=par->GetMusicWidget()->GetMPDSeekPerc();
513设置[5]。运算符[](“值”)=百分比;
514如果(百分比<0.2)
515设置[5]。运算符[](“fg_alpha”)=0.2;
516其他
517设置[5]。运算符[](“fg_alpha”)=百分比;
valgrind输出来自线路514 如果(百分比<0.2)

我做错了什么?提前谢谢

条件跳转或移动取决于未初始化的值

这通常意味着您有一个if测试未初始化的值。因此,if的结果是随机的

为了更进一步,您需要知道这个变量是在哪里分配/声明的。您可以从以下位置获取此信息:

未初始化的值是由堆分配1:运算符new(unsigned long)在。。。 MusicWidget::MusicWidget(QWidget*)位于[…]MusicWidget.cpp:148

这意味着在musicwidget.cpp的第148行中,您在int(百分比)上创建了一个新的值,但没有初始化它。你应该在那里发现你的错误


离题:在int上使用new通常不是一个好主意。如果可能,不如将其声明为变量

看起来valgrind传播了在
GetMPDSeekPerc()
中访问的未初始化值的使用,并在未初始化值实际用于某个对象而不是仅仅传递时报告错误。关于
未初始化值的消息是通过堆分配创建的…
非常直截了当地指向未初始化值的来源。

我没有在int上使用new。这是我在musicwidget.cpp 145 zekton_font=new QFont(“zekton”)中的内容;146 INCOLATA_font=新QFont(“INCOLATA”);147 148客户机=新的NomadMPD(本);149客户端->连接();可以由Qt进行分配。你能给出musicwidget.cpp第148行的代码吗;146 INCOLATA_font=新QFont(“INCOLATA”)
147
148客户机=新的NomadMPD(此)
149客户端->连接()来自musicwidget.cppThank,所以我猜NomadMPD包含返回的百分比?是的。我解决了这个问题。结果表明,百分比变量可能并非始终都有值。我在NomadMPD构造函数中将变量初始化为零,valgrind停止抱怨。感谢您的帮助。事实证明,getMPDSeekPerc()中的百分比变量可能并不总是有值。我在构造函数中将变量初始化为零,valgrind停止抱怨。谢谢你的帮助。