我正在学习一个关于 Qt 框架的在线类(class),我发现了这样的代码:
StartUp::StartUp(QObject *parent) : QObject(parent),
m_engine(*new QQmlApplicationEngine()),
m_mainViewMgr(*new MainViewMgr)
{
//some code
}
我的问题是 (*new )
是什么意思?
我知道 new
运算符返回一个指向动态分配内存的指针。
如果 (*new )
表示取消引用返回的指针,这不会导致内存泄漏吗?
最佳答案
TL;DR:编写“在线类(class)”的人决定完成 95% 的工作:)
据推测,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) {}
};
关于c++ - (*new) 在 C++ 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45439634/