QObject::d eleteLater在我的Qt测试中没有像预期的那样调用
QObject::deleteLater is not called as expected in my Qt Test
我正在测试一个共享库,其中包含对内部deleteLater
的调用。 库中没有运行事件循环,因此应用程序的要求是运行事件循环,以便正确释放所有内存。
但在测试中,对象 dtor 未按预期调用。
例如:
void test1()
{
Foo foo;
QSignalSpy spy(&foo, SIGNAL(mySignal(Status)));
foo.do(); // should trigger mySignal
QVERIFY(spy.wait(10000)); // event loop started for 10 s max
QCOMPARE(spy.count(), 1);
QList<QVariant> sig = spy.takeFirst();
Foo::Status status = qvariant_cast<Foo::Status>(sig.at(0));
QVERIFY2(status == Foo:Ok, "Failed");
}
类Foo
如下所示:
class Foo : public QObject
{
Q_OBJECT
// ... methods, signals, slots..
private slots:
// this call is asynchronous (depends on a network reply)
void myslot() {
//..
m_obj->deleteLater();
emit mySignal(Foo:Ok);
}
};
我在 m_obj 的 dtor 中添加了一些调试打印,并且在执行 test1 时不会调用它。
但是,如果我执行测试两次(通过添加作为test1副本的test2插槽(,则调用一次。
我的理解是,当信号发出时,它会停止间谍事件循环,然后永远不会调用deleteLater
。 之后,第二个事件循环在 test2 中启动,它处理上一个 test1 中的挂起删除。
正确吗? 谢谢。
是的,你是对的。由于QSignalSpy
和Foo
位于同一线程中,因此信号mySignal
不是通过事件循环传递,而是通过直接连接传递。因此,事件循环在发出信号后立即停止myslot
。但是,由于myslot
是由同一事件循环调用的,因此只有在myslot
返回时,控制权才会返回给它。因此,当事件循环可能执行deleteLater
请求的清理时,它已经停止了。
如果要测试是否正确清理m_obj
,则可以创建一个附加QSignalSpy
并将其连接到每个QObject
在被销毁时发出的QObject::destroyed
信号。
但是,您需要将m_obj
作为依赖项传入,以在构造函数中或通过资源库Foo
,而不是在Foo
本身中构造它。
然后,测试可能如下所示:
void test1()
{
auto obj = new Obj{}; // will be assigned to `Foo::m_obj`
Foo foo{obj};
QSignalSpy deletion_spy(obj, &QObject::destroyed);
QSignalSpy mysignal_spy(&Foo, &Foo::mySignal);
QVERIFY(deletion_spy.wait(10000));
QCOMPARE(deletion_spy.count(), 1); // verify that `obj` got deleted
QCOMPARE(mysignal_spy.count(), 1);
QList<QVariant> sig = spy.takeFirst();
Foo::Status status = qvariant_cast<Foo::Status>(sig.at(0));
QVERIFY2(status == Foo:Ok, "Failed");
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- QObject::d eleteLater在我的Qt测试中没有像预期的那样调用