2011-09-08 4 views
2

Je suis actuellement sous Qt 4.7.4 sous Mac OS X 10.6. J'ai installé Qt en utilisant MacPorts.QObject double suppression

J'ai essayé d'utiliser le développement piloté par les tests dans le cadre de ma pratique de codage, et j'utilise QtTest à cette fin. J'ai une classe dérivée de QObject, et quand j'essaye de tester le code, mon test échoue quand il devrait passer. Je regardais la sortie (test -vs), et je vois l'erreur suivante:

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

Dans un test, je constate l'erreur ci-dessus deux fois, prenant en sandwich le test réel. Cela indique que l'objet enfant est détruit avant l'utilisation et semble de nouveau supprimé après le test. J'ai utilisé QPointer et confirmé que l'objet devient invalide avant utilisation. L'alternative consiste à initialiser les variables dans chaque cas de test, ce qui annule le but d'une initialisation à une seule impulsion et, à son tour, augmente le gonflement du code.

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

J'utilise la commande suivante (via 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

Je ne me rappelle pas l'expérience de ce problème avec Qt 4.6, et je suis confus quant à la destruction prématurée.

Je voudrais penser que ce n'est pas un bug dans Qt, mais je suis curieux de savoir si quelqu'un d'autre a rencontré un tel problème et trouvé une solution. J'aime Qt, mais ce problème ne se limitera pas aux tests unitaires. Toute aide sera certainement appréciée.

- Edition -

code source pour le cas de test:

dans le fichier .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 

dans le fichier .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); 
} 
+3

pouvez-vous nous montrer le code de test pour la classe? – fabrizioM

Répondre

1

Cette ligne ElementTest::initTestCase():

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

crée une variable locale nommée element qui n'a rien à voir avec le membre ElementTest::element. Le vairable local est détruit quand ElementTest::initTestCase() revient.

Essayez de changer la ligne:

element = new Element(this);  
+0

Merci pour votre réponse rapide. J'aurais dû réaliser que cela créerait une valeur temporaire. Ce sont les petites erreurs qui sont négligées. – Tim