Cleaner destruction handling

This commit is contained in:
Atlante45 2014-12-16 16:22:59 -08:00
parent b2dac6f53f
commit 3f2b5aeca4

View file

@ -20,7 +20,14 @@
public:\ public:\
typedef QSharedPointer<T> SharedPointer;\ typedef QSharedPointer<T> SharedPointer;\
private:\ private:\
void customDeleter() { delete this; }\ void customDeleter() {\
QObject* thisObject = dynamic_cast<QObject*>(this);\
if (thisObject) {\
thisObject->deleteLater();\
} else {\
delete this;\
}\
}\
friend class DependencyManager; friend class DependencyManager;
class QObject; class QObject;
@ -42,17 +49,7 @@ private:
template <typename T> template <typename T>
QSharedPointer<T> DependencyManager::get() { QSharedPointer<T> DependencyManager::get() {
static QSharedPointer<T> sharedPointer; static QSharedPointer<T> sharedPointer = QSharedPointer<T>(new T(), &T::customDeleter);
static T* instance = new T();
if (instance) {
if (dynamic_cast<QObject*>(instance) != NULL) { // If this is a QOject, call deleteLater for destruction
sharedPointer = QSharedPointer<T>(instance, &T::deleteLater);
} else { // Otherwise use custom deleter to avoid issues between private destructor and QSharedPointer
sharedPointer = QSharedPointer<T>(instance, &T::customDeleter);
}
instance = NULL;
}
return sharedPointer; return sharedPointer;
} }