QObject двойное удаление - PullRequest
       9

QObject двойное удаление

2 голосов
/ 08 сентября 2011

В настоящее время я использую Qt 4.7.4 в Mac OS X 10.6.Я установил Qt с помощью MacPorts.

Я пытался использовать разработку через тестирование как часть моей практики кодирования, и я использую QtTest для этой цели.У меня есть класс, производный от QObject, и когда я пытаюсь протестировать код, мой тест не проходит, когда он должен пройти.Я посмотрел на вывод (test -vs) и вижу следующую ошибку:

INFO: periodtable :: 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 -Wab-атрибут -WWMAT-формата -WWW-WAT-DWOR-атрибут -WWW-формата -WWW-WAT-DWORвиртуальный -Wsign-promo -Wformat-nonliteral -Wdisabled-оптимизация -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 -двух-векторизация --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, но эта проблема не ограничивается юнит-тестами.Любая помощь, безусловно, будет оценена.

- Правка -

Исходный код для теста:

в .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);
}

1 Ответ

1 голос
/ 08 сентября 2011

Эта строка в ElementTest::initTestCase():

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

создает локальную переменную с именем element, которая не имеет ничего общего с членом ElementTest::element. Местный vairable разрушается, когда ElementTest::initTestCase() возвращается.

Попробуйте изменить строку на:

element = new Element(this);    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...