QObject双删除

时间:2011-09-08 17:50:48

标签: c++ qt qobject

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

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

  

INFO:periodictable :: ElementTest :: testName()信号:QObject(7fff5fbfd860)被破坏((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_FULLY_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 -Woverloaded-virtual -Wsign-promo -Wformat-nonliteral -Wdisabled-optimization -Wformat-y2k -Winit-self -Winvalid-pch -Wunsafe-loop-optimizations -Wmissing-format-attribute -Wmissing-include-dirs -Wstrict-aliasing = 3 -Wswitch-enum -Wvariadic -macros -Wvolatile-register-var -std = gnu ++ 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,但这个问题不仅限于单元测试。任何帮助肯定会受到赞赏。

- 编辑 -

测试用例的源代码:

<。>文件中的

#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);
}

1 个答案:

答案 0 :(得分:1)

ElementTest::initTestCase()中的这一行:

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

正在创建一个名为element的局部变量,该变量与成员ElementTest::element无关。当ElementTest::initTestCase()返回时,本地可维护性将被破坏。

尝试将行更改为:

element = new Element(this);