首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QLayout和Valgrind

QLayout和Valgrind
EN

Stack Overflow用户
提问于 2020-04-29 17:00:00
回答 1查看 42关注 0票数 0

我一直在为Valgrind的消息而苦苦挣扎。我使用的是取自Qt示例的QLayout (FlowLayout),当用户按下add按钮时,我在运行时将一些小部件添加到此布局中。这是我继承的容器QWidget类的构造函数中的初始化片段:

代码语言:javascript
复制
// scroll area
auto* central = new QWidget();
central->setObjectName("CentralWidget");
m_layout = new FlowLayout;
ui->scrollArea_step->setFrameShape(QFrame::NoFrame);
central->setLayout(m_layout);
ui->scrollArea_step->setWidgetResizable(true);
ui->scrollArea_step->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->scrollArea_step->setWidget(central);

我知道因为有了setWidget(中心),我不需要为“中心”小部件分配父级。

当用户在界面中单击add按钮时,程序将调用以下代码片段:

代码语言:javascript
复制
// create the button from rf data
ShortMenuPushButton* stepButton = _createStepButton(m_rfData);
m_layout->addWidget(stepButton);
QPushButton* deleteStepButton = _createDeleteButton();
m_layout->addWidget(deleteStepButton);

_createStepButton的代码如下:

代码语言:javascript
复制
auto* stepButton = new ShortMenuPushButton(this);

对于另一个按钮,_createDeleteButton()也执行相同的操作。

如果我运行Valgrind,我得到相同的消息:

代码语言:javascript
复制
==59123== 176 bytes in 2 blocks are definitely lost in loss record 8,040 of 8,630
==59123==    at 0x483BE63: operator new(unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==59123==    by 0x6430849: QLayoutPrivate::createWidgetItem(QLayout const*, QWidget*) (qlayout.cpp:200)
==59123==    by 0x6431AA0: QLayout::addWidget(QWidget*) (qlayout.cpp:236)
==59123==    by 0x7DA967: Dialogs::Dialog_multistep::onButtonAddStep_clicked() (dialog_multistep.cpp:419)
==59123==    by 0x7E8B13: QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (Dialogs::Dialog_multistep::*)()>::call(void (Dialogs::Dialog_multistep::*)(), Dialogs::Dialog_multistep*, void**) (qobjectdefs_impl.h:152)
==59123==    by 0x7E8A87: void QtPrivate::FunctionPointer<void (Dialogs::Dialog_multistep::*)()>::call<QtPrivate::List<>, void>(void (Dialogs::Dialog_multistep::*)(), Dialogs::Dialog_multistep*, void**) (qobjectdefs_impl.h:185)
==59123==    by 0x7E89B4: QtPrivate::QSlotObject<void (Dialogs::Dialog_multistep::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (qobjectdefs_impl.h:414)
==59123==    by 0x9284CB5: call (qobjectdefs_impl.h:394)
==59123==    by 0x9284CB5: QMetaObject::activate(QObject*, int, int, void**) (qobject.cpp:3774)
==59123==    by 0x64FAFF1: QAbstractButton::clicked(bool) (moc_qabstractbutton.cpp:312)
==59123==    by 0x64FB1F3: QAbstractButtonPrivate::emitClicked() (qabstractbutton.cpp:414)
==59123==    by 0x64FCD8D: QAbstractButtonPrivate::click() (qabstractbutton.cpp:407)
==59123==    by 0x64FCEE4: QAbstractButton::mouseReleaseEvent(QMouseEvent*) (qabstractbutton.cpp:1011)

但在FlowLayout中,我使用了如下的构造函数:

代码语言:javascript
复制
void FlowLayout::clear()
{
    QLayoutItem* item;
    while ((item = takeAt(0)))
    {
        delete item->widget();
    }
}

我不知道哪里漏水了。

我很感谢你的建议。谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-05-03 16:07:03

我找到了问题所在。在我写的时候,我使用了FlowLayout类,取自一个著名的例子(Qt)。方法clear执行以下操作:

代码语言:javascript
复制
void FlowLayout::clear()
{
    QLayoutItem* item;
    while ((item = takeAt(0)))
    {
        delete item->widget();
    }
}

但是QLayoutItem在方法QLayoutItem::widget()中返回nullptr。

也许是因为QLayoutItem是一个基类,应该被派生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61497936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档