Qt_IM_4 - 8BitsCoding/RobotMentor GitHub Wiki


간략하게 정리하면

QSharedPointer<consumer> c(new consumer, &QObject::deleteLater);과 같이 sharedpointer를 선언가능하며

c.clear()로 reference 해제를 할 수 있다.

// main.cpp
#include <QtCore/QCoreApplication>

#include <qdebug.h>
#include <qsharedpointer.h>
#include "test.h"
#include "consumer.h"

// QSharedPointer will delete the pointer it is holding when it goes out of scope,
// provided no other QSharedPointer objects are referencing it.

void doDeleteLater(test * obj) {
	qInfo() << "Deleting : " << obj;
	obj->deleteLater();
}

QSharedPointer<test> createPointer() {
	test* t = new test();		// the bad way
	t->setObjectName("Test Object");

	QSharedPointer<test> p(t, doDeleteLater);
	return p;
}

void doStuff(QSharedPointer<consumer> ptr) {
	qInfo() << "In Function : " << ptr.data()->tester;

	ptr.clear();
	// Does not actully delete!
	// just remove the reference
}

QSharedPointer<consumer> makeConsumer() {
	QSharedPointer<consumer> c(new consumer, &QObject::deleteLater);
	QSharedPointer<test> t = createPointer();

	c.data()->tester.swap(t);
	doStuff(c);

	return c;
}

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

	QSharedPointer<consumer> consume = makeConsumer();
	qInfo() << "In main : " << consume.data()->tester;

	consume.clear();
	// Does not actully delete!
	// just remove the reference

	return a.exec();
}
// test.h
#pragma once

#include <qobject.h>
#include <qdebug.h>

class test : public QObject
{
	Q_OBJECT
public:
	explicit test(QObject* parent = nullptr);
	~test();

signals:

public slots:
};
// test.cpp
#include "test.h"

#include <qdebug.h>

test::test(QObject* parent) : QObject(parent)
{
	qInfo() << "test class Created!";
}

test::~test()
{
	qInfo() << "test class destructed!";
}
// consumer.h
#pragma once

#include <qobject.h>
#include <qdebug.h>
#include <qsharedpointer.h>

#include "test.h"

class consumer : public QObject
{
	Q_OBJECT
public:
	explicit consumer(QObject* parent = nullptr);
	~consumer();

	QSharedPointer<test> tester;

signals:

public slots:
};
// consumer.cpp
#include "consumer.h"

consumer::consumer(QObject* parent) : QObject(parent)
{
	qInfo() << "consumer class Created!";
}

consumer::~consumer()
{
	qInfo() << "consumer class Destructed!";
}

이미지

⚠️ **GitHub.com Fallback** ⚠️