QObject двойно изтриване

В момента използвам Qt 4.7.4 на Mac OS X 10.6. Инсталирах Qt с помощта на MacPorts.

Опитвам се да използвам разработка, управлявана от тестове, като част от моята практика на кодиране и използвам QtTest за тази цел. Имам клас, извлечен от QObject, и когато се опитам да тествам кода, тестът ми се проваля, когато трябва да премине. Погледнах изхода на (test -vs) и наблюдавам следната грешка:

ИНФОРМАЦИЯ: 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-промо -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-протектор -fPIC -fstack-протектор -Wstack-протектор

Не мога да си спомня да съм имал този проблем с Qt 4.6 и съм объркан относно преждевременното унищожаване.

Бих искал да мисля, че това не е грешка в Qt, но съм любопитен дали някой друг се е сблъсквал с подобен проблем и е намерил решение. Харесвам Qt, но този проблем няма да се ограничи до модулните тестове. Всяка помощ със сигурност ще бъде оценена.

-- Редактиране --

Изходен код за тестов случай:

в .h файл

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

person Tim    schedule 08.09.2011    source източник
comment
можете ли да ни покажете тестовия код за класа?   -  person fabrizioM    schedule 08.09.2011


Отговори (1)


Този ред в ElementTest::initTestCase():

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

създава локална променлива с име element, която няма нищо общо с члена ElementTest::element. Локалната променлива се унищожава, когато ElementTest::initTestCase() се върне.

Опитайте да промените реда на:

element = new Element(this);    
person Michael Burr    schedule 08.09.2011
comment
Благодаря Ви за бързия отговор. Трябваше да разбера, че това ще създаде временна стойност. Малките грешки се пренебрегват. - person Tim; 08.09.2011