我正在关注Qt框架的在线课程,我找到了这样的代码:
StartUp::StartUp(QObject *parent) : QObject(parent),
m_engine(*new QQmlApplicationEngine()),
m_mainViewMgr(*new MainViewMgr)
{
//some code
}
我的问题是(*new )
是什么意思?
我知道new
运算符返回一个指向动态分配内存的指针。
如果(*new )
意味着解除引用返回的指针,这不会导致内存泄漏吗?
答案 0 :(得分:3)
据推测,StartUp
类声明如下:
class StartUp : public QObject {
Q_OBJECT
QQmlApplicationEngine & m_engine;
MainViewMgr & m_mainViewMgr;
public:
StartUp(QObject * parent = {});
};
由于QQmlApplicationEngine
和MainViewMgr
都应该在StartUp
对象存活的情况下持续,因此通过引用保留它们可能会有所帮助。唉,除非为两个对象设置了父对象,否则对象会泄漏,所以至少正确的构造函数应如下所示:
StartUp::StartUp(QObject *parent) : QObject(parent),
m_engine(*new QQmlApplicationEngine(this)),
m_mainViewMgr(*new MainViewMgr(this))
{}
此时你应该问自己:为什么不按价值按住对象?没有必要通过引用来保存它们并在堆上显式创建它们。因此:
class StartUp : public QObject {
Q_OBJECT
QQmlApplicationEngine m_engine{this};
MainViewMgr m_mainViewMgr{this};
public:
StartUp(QObject * parent = {}) : QObject(parent) {}
};
在StartUp
移动到另一个线程的情况下,仍然使用父级创建了两个对象 - 然后他们将安全地跟踪它。如果StartUp
仅用于主线程,则成员对象可以是无父对象的:
class StartUp : public QObject {
Q_OBJECT
QQmlApplicationEngine m_engine;
MainViewMgr m_mainViewMgr;
public:
StartUp(QObject * parent = {}) : QObject(parent) {}
};