diff --git a/bonjour.cpp b/bonjour.cpp index 8c65c7c..ba182ef 100644 --- a/bonjour.cpp +++ b/bonjour.cpp @@ -43,14 +43,16 @@ void Resolver::addressReady() cleanUp(); } -void Resolver::cleanUp() +QHash::iterator Resolver::cleanUp() { DNSServiceRefDeallocate(DNSresolverRef); DNSServiceRefDeallocate(DNSaddressRef); // the QSocketNotifiers resolverNotifier and addressNotifier get deleted when the QSharedPointer gets deleted along with the Resolver. No need to clear them here. QString key = zcs->name() + QString::number(zcs->interfaceIndex()); - ref->resolvers.remove(key); + QHash::iterator it = ref->resolvers.find(key); + it = ref->resolvers.erase(it); delete this; + return it; } QZeroConfPrivate::QZeroConfPrivate(QZeroConf *parent) @@ -232,8 +234,8 @@ void QZeroConfPrivate::cleanUp(DNSServiceRef toClean) if (toClean == browser) { browser = nullptr; browserNotifier.clear(); - for (auto resolver : resolvers) - resolver->cleanUp(); + for (QHash::iterator it = resolvers.begin(); it != resolvers.end(); ) + it = (*it)->cleanUp(); // cleanUp() modifies resolvers, so it returns a valid iterator resolvers.clear(); for (auto service : pub->services) emit pub->serviceRemoved(service); diff --git a/bonjour_p.h b/bonjour_p.h index 6508316..16748db 100644 --- a/bonjour_p.h +++ b/bonjour_p.h @@ -42,7 +42,7 @@ class Resolver : public QObject { Q_OBJECT public: - void cleanUp(); + QHash::iterator cleanUp(); QZeroConfService zcs; QZeroConfPrivate *ref = nullptr; DNSServiceRef DNSresolverRef = nullptr;