2011-09-08 67 views
2

我目前在Mac OS X 10.6上運行Qt 4.7.4。我使用MacPorts安裝Qt。QObject雙刪除

我一直在嘗試使用測試驅動開發作爲我的編碼練習的一部分,我正在使用QtTest來達到此目的。我有一個派生自QObject的類,當我嘗試測試代碼時,測試失敗時它應該通過。我看着(試驗-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_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,但這個問題不會侷限於單元測試。任何幫助肯定會受到讚賞。

- 編輯 - 測試用例

的源代碼:在.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); 
} 
+3

,你能告訴我們該類的測試代碼? – fabrizioM

回答

1

這條線ElementTest::initTestCase()

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

正在創建一個名爲element的局部變量,它與成員ElementTest::element無關。當ElementTest::initTestCase()返回時,本地Vairable被破壞。

嘗試改變行:

element = new Element(this);  
+0

感謝您的快速回復。我應該意識到這會創造一個暫時的價值。這是被忽視的小錯誤。 – Tim