QObject double deletion
QObject double deletion
我目前在Mac OS X 10.6上运行Qt 4.7.4。我用MacPorts安装了Qt。
我一直在尝试使用测试驱动开发作为我编码实践的一部分,并且我为此目的使用QtTest。我有一个从QObject派生的类,当我尝试测试代码时,我的测试在应该通过的时候失败了。我查看了(test -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_fullly_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 - woverload -virtual -Wsign-promo -Wformat-nonliteral - wdisable -optimization -Wformat-y2k -Winit-self -Winvalid-pch -Wunsafe-loop-optimizations -Wmissing-format-attribute -Wmissing-include-dirs -Wstrict-aliasing=3 -Wswitch-enum - wvariadlic - wvolatile - register_var -std= gn++ 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,但这个问题并不局限于单元测试。如有任何帮助,我将不胜感激。
—Edit—
测试用例的源代码:in .h file
#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);
}
ElementTest::initTestCase()
:
QPointer<Element> element(new Element(this));
正在创建一个名为element
的局部变量,该变量与成员ElementTest::element
无关。当ElementTest::initTestCase()
返回时,局部变量将被销毁。
尝试将行改为:
element = new Element(this);
- C++在数学计算中将double转换为int
- 在c++中为double类型的数组创建一个unique_ptr
- vector<vector<double>> to mxArray using memcpy
- (double) 和 double() 之间的区别
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- C++ Version Of Double.longBitsToDouble
- 错误:类型"double()"和"double()"的操作数无效到二进制&quo
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 使用 std::vector<double> 访问由 std::unique_ptr<double[2] 管理的数据>
- 将 std::vector<double> 从 C++ 包装到 C 以在 Swift 中使用
- 错误:无法将"<lambda(double)>"转换为"double(*)(double)"
- 如何正确将"strings"转换为"double"?
- 如何在<double>矢量中创建复杂类型的模板<T>?
- "double* grade"、"double *grade"和"double* fn()"有什么区别?
- 在不损失精度的情况下将double从C++传输到python
- 重复使用预分配的向量<复杂<double>>作为<double>长度两倍的向量
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- Zedboard zynq-7000 Opencl 浮点数从类型 'double*' 强制转换为类型 'double' 无效
- QObject double deletion