Я тестирую разделяемую библиотеку, которая содержит внутренний вызов 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);
}
};
Я добавил отладочную печать в dtor m_obj, и онне вызывается при выполнении test1.
Однако, если я выполню тест дважды (добавив слот test2, являющийся копией test1), он будет вызван один раз.
Мое пониманиеявляется то, что когда сигнал испускается, он останавливает цикл шпионских событий, а затем deleteLater
никогда не вызывается.И после этого второй цикл обработки событий запускается в test2, он обрабатывает ожидающее удаление из предыдущего test1.
Это правильно?Спасибо.