(* new)在c ++中意味着什么?

时间:2017-08-01 13:44:23

标签: c++ qt

我正在关注Qt框架的在线课程,我找到了这样的代码:

StartUp::StartUp(QObject *parent) : QObject(parent),
    m_engine(*new QQmlApplicationEngine()),
    m_mainViewMgr(*new MainViewMgr)

{
 //some code
}

我的问题是(*new )是什么意思?

我知道new运算符返回一个指向动态分配内存的指针。 如果(*new )意味着解除引用返回的指针,这不会导致内存泄漏吗?

1 个答案:

答案 0 :(得分:3)

TL; DR:谁写过“在线课程”的人决定做95%的工作:)

据推测,StartUp类声明如下:

class StartUp : public QObject {
  Q_OBJECT
  QQmlApplicationEngine & m_engine;
  MainViewMgr & m_mainViewMgr;
public:
  StartUp(QObject * parent = {});
};

由于QQmlApplicationEngineMainViewMgr都应该在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) {}
};