QObject double deletion

QObject double deletion

本文关键字:deletion double QObject      更新时间:2023-10-16

我目前在Mac OS X 10.6上运行Qt 4.7.4。我用MacPorts安装了Qt。

我一直在尝试使用测试驱动开发作为我编码实践的一部分,并且我为此目的使用QtTest。我有一个从QObject派生的类,当我尝试测试代码时,我的测试在应该通过的时候失败了。我查看了(test -vs)的输出,发现了以下错误:

INFO: periodictable::ElementTest::testName() Signal: QObject(7fff5fbfd860) destroyed ((QObject*)7fff5fbfd860)

在一个测试用例中,我观察到上述错误两次,夹在实际测试中。这表明子对象在使用之前被销毁,并在测试之后再次删除。我已经使用了QPointer,并确认该对象在使用前失效。另一种方法是在每个测试用例中初始化变量,从而破坏了单次初始化的目的,从而增加了代码的膨胀。

class Element : public QObject
{
   Q_OBJECT
   Q_PROPERTY(QString name READ name WRITE setName NOTIFY valueChanged)
public:
   Element(QObject* parent = 0) : QObject(parent) {}
   void setName(const QString& name);
   QString name() const;
Q_SIGNALS:
   void valueChanged(QString value);
private:
   QString elementName;
   Q_DISABLE_COPY(Element);
};
我使用以下命令(通过cmake):

g++ -D_FORTIFY_SOURCE=2 - d_glibcxx_fullly_dynamic_string -D_FORTIFY_SOURCE=2 -DQT_TEST_LIB -DQT_CORE_LIB -DQT_DEBUG -Wformat-security -Wmissing-format-attribute -Wformat=2 -Wctor-dtor-privacy -Wabi - woverload -virtual -Wsign-promo -Wformat-nonliteral - wdisable -optimization -Wformat-y2k -Winit-self -Winvalid-pch -Wunsafe-loop-optimizations -Wmissing-format-attribute -Wmissing-include-dirs -Wstrict-aliasing=3 -Wswitch-enum - wvariadlic - wvolatile - register_var -std= gn++ 0x-fmessage-length=0 -ftree-vectorize——param max-unroll-times=4 -pipe -fabi-version=4 -g -I/opt/local/include/QtCore -fPIC -fstack-protector -fPIC -fstack-protector -Wstack-protector

我不记得在Qt 4.6中遇到过这个问题,我对过早销毁感到困惑。

我想认为这不是Qt中的错误,但我很好奇是否有人遇到过这样的问题并找到了解决方案。我喜欢Qt,但这个问题并不局限于单元测试。如有任何帮助,我将不胜感激。

—Edit—

测试用例的源代码:

in .h file

#ifndef  TEST_ELEMENT_H
#define  TEST_ELEMENT_H
#include    <QtCore/QObject>
#include    <QtCore/QPointer>
namespace hashtable
{
class Element;                                  // Forward declaration
class ElementTest : public QObject
{
    Q_OBJECT
private Q_SLOTS:
    void initTestCase();
    void testName();
private:
    QString name;
    QPointer<Element> element;
};
}
#endif

.cpp文件

void ElementTest::initTestCase()
{
    name = QString("Hydrogen");
    mass = 1.008;
    QPointer<Element> element(new Element(this));
    return;
}
void ElementTest::testName()
{
    element->setProperty("name", name);
    QCOMPARE(element->property("name").toString(), name);
}

ElementTest::initTestCase():

QPointer<Element> element(new Element(this));

正在创建一个名为element的局部变量,该变量与成员ElementTest::element无关。当ElementTest::initTestCase()返回时,局部变量将被销毁。

尝试将行改为:

element = new Element(this);