2011-09-08 4 views
2

현재 Mac OS X 10.6에서 Qt 4.7.4를 실행 중입니다. MacPorts를 사용하여 Qt를 설치했습니다.QObject 이중 삭제

필자는 코딩 연습의 일환으로 테스트 중심 개발을 사용하려고 노력했으며,이 목적으로 QtTest를 사용하고 있습니다. QObject에서 파생 된 클래스가 있고 코드를 테스트하려고하면 통과해야 할 때 테스트가 실패합니다. I는 (시험 -Vs)의 출력에보고, 및 I는 다음과 같은 오류 관찰 : 실제 시험을 사이에두고 두 번 테스트 케이스

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

는, I는 상기 에러를 관찰한다. 이는 자식 객체가 사용 전에 삭제되었으며 테스트 후에 다시 삭제 된 것으로 나타냅니다. QPointer를 사용하여 오브젝트가 사용 전에 유효하지 않게되었음을 확인했습니다. 대안은 각 테스트 케이스 내에서 변수를 초기화하여 단일 샷 초기화의 목적을 무효화하고 결과적으로 코드 팽창을 증가시키는 것입니다. 내가 Qt를 4.6로이 문제가 발생 회수 할 수 없습니다

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

, 나는 조기 파괴로 혼란 스러워요 :

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를 통해) 다음 명령을 사용합니다.

나는 이것이 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)); 

ElementTest::element과 아무 관련이없는 element이라는 로컬 변수를 만듭니다. ElementTest::initTestCase()가 반환하면 지역의 전적이 파괴됩니다.

element = new Element(this);  
+0

빠른 답장을 보내 주셔서 감사합니다. 나는 이것이 일시적인 가치를 창출한다는 것을 깨달았어야했다. 간과하게되는 작은 실수입니다. – Tim