C++ QObject双删除
我目前正在Mac OS X 10.6上运行Qt 4.7.4。我使用MacPorts安装了Qt 我一直在尝试使用测试驱动的开发作为我的编码实践的一部分,为此我正在使用QtTest。我有一个从QObject派生的类,当我尝试测试代码时,当它应该通过时,测试失败。我查看了(test-vs)的输出,发现以下错误: 信息:periodictable::ElementTest::testName()信号:QObject(7fff5fbfd860)已销毁((QObject*)7fff5fbfd860) 在一个测试用例中,我观察上述错误两次,将实际测试夹在中间。这表示子对象在使用前已销毁,在测试后似乎再次删除。我已使用QPointer并确认该对象在使用前无效。另一种方法是在每个测试用例中初始化变量,从而破坏单次初始化的目的,进而增加代码膨胀C++ QObject双删除,c++,qt,qobject,C++,Qt,Qobject,我目前正在Mac OS X 10.6上运行Qt 4.7.4。我使用MacPorts安装了Qt 我一直在尝试使用测试驱动的开发作为我的编码实践的一部分,为此我正在使用QtTest。我有一个从QObject派生的类,当我尝试测试代码时,当它应该通过时,测试失败。我查看了(test-vs)的输出,发现以下错误: 信息:periodictable::ElementTest::testName()信号:QObject(7fff5fbfd860)已销毁((QObject*)7fff5fbfd860) 在一个
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属性-Wformat=2-Wctor dtor privacy-Wabi-Woverloaded virtual-Wsign-promoto-Wformat nonliteral-Wdisabled优化-Wformat-wisabled优化-Wformat-y2k-Winit自有效pch-Wunsafe循环优化-Wmissing format属性-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-Wstack protector
我不记得Qt4.6遇到过这个问题,我对过早破坏感到困惑
我认为这不是Qt中的一个bug,但我很好奇是否有其他人遇到过这样的问题并找到了解决方案。我喜欢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
\ifndef测试元素\u H
#定义测试元素
#包括
#包括
名称空间哈希表
{
类元素;//转发声明
类元素测试:公共QObject
{
Q_对象
专用Q_插槽:
void initTestCase();
void testName();
私人:
QString名称;
指针元件;
};
}
#恩迪夫
在.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);
}
void ElementTest::initTestCase()
{
名称=QString(“氢”);
质量=1.008;
QPointer元素(新元素(本));
返回;
}
void ElementTest::testName()
{
元素->设置属性(“名称”,名称);
QCOMPARE(元素->属性(“名称”).toString(),名称);
}
元素测试::initTestCase()中的这一行
你能给我们看一下这个课程的测试代码吗?谢谢你的快速回复。我应该意识到这会创造一个暂时的价值。这些小错误被忽视了。
QPointer<Element> element(new Element(this));
element = new Element(this);