c++ - (*new) 在 C++ 中是什么意思?

标签 c++ qt

我正在学习一个关于 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 = {});
};

由于 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) {}
};

关于c++ - (*new) 在 C++ 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45439634/

相关文章:

c++ - 在窗口中显示任何内容之前和抛光窗口之后无法进行介绍

c++ - 如何查找 QTextEdit 中显示的数据长度

c++ - Unresolved external cv::flip cv::imshow

c++ - 带字符串文字的自动

c++ - 在 QSqlQueryModel 中交换表头(转置表)

c++ - QVector 预分配访问线程安全

c++ - 从命令行使用 Eclipse CDT

c++ - 没有数据交换的 TCP 连接超时

c++ - 从文本文件中读取数据

c++ - 让 Qt 在 Fedora 12 中工作