首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该删除类的析构函数中的QPointer吗?

我应该删除类的析构函数中的QPointer吗?
EN

Stack Overflow用户
提问于 2019-05-04 16:53:16
回答 2查看 1.8K关注 0票数 1

假设我有一个类,如下所示:

代码语言:javascript
复制
#include <Object>
#include <QProcess>

class MyClass: public QObject {
private:
    QPointer<QProcess> m_process{ nullptr };
public:
    MyClass(QObject *parent = nullptr)
        : QObject{ parent }
        , m_process{new QProcess{} }
    {
        QObject::connect(m_process, &QProcess::errorOccurred,
            this, [](QProcess::ProcessError error) {
            qDebug() << "error: " << error;
            });
    }
    ~MyClass()
    {
        if (m_process)  delete m_process; //--> is it necessary?
    }
};

如析构函数中所示,是否需要手动删除m_process

不幸的是,我不能使用std::unique_ptrstd::shared_ptr,例如

代码语言:javascript
复制
QObject::connect(m_process, &QProcess::errorOccurred,
            this, [](QProcess::ProcessError error) {
            qDebug() << "error: " << error;
            });

我还没有看到适当的QObject::connect过载。

另一方面,在QPointer::~QPointer()中,我读到:

摧毁被保护的指针。就像普通指针一样,销毁受保护的指针并不会破坏所指向的对象。

这意味着QPointer::~QPointer()将在MyClass的对象超出范围时删除,因此我要删除m_process两次?

还是我误会了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-04 17:32:03

QPointer的目的是提供指向QObject子类的受保护或弱指针。当对象超出作用域时,它不会删除对象,它只知道它指向的对象是活动的还是已删除的。

所以你当前的代码在这个意义上是正确的。几点意见:

  • 在变量声明中为指针设置默认值nullptr并不有用,因为您在构造函数初始化程序列表中初始化了它。
  • 在删除之前,不需要检查指针是否为null,因为delete nullptr;是有效代码,什么也不做。
  • 如果QProcess的生存期与包含对象的生存期相同,则应该将其作为成员变量,而不使用new,除非有特定的原因。
  • 如果您确实想使用new来分配它,请考虑QProcess是否可以有一个父QObject,它将删除它。
  • 或者,您应该将指针包装在QScopedPointerstd::unique_ptr中,因为它们拥有所指向的对象,并在超出作用域时将其删除。
票数 3
EN

Stack Overflow用户

发布于 2019-05-04 17:29:14

QPointer不是智能指针。它不管理它所指向的对象。它只跟踪它是否被删除。你需要自己删除它:

代码语言:javascript
复制
~MyClass()
{
    delete m_process.data();
}

删除指向对象时,data()将为空。

您不需要在删除它之前检查它是否为空,因为删除空指针是可以的(它只是什么都不做)。

不过,我不认为你需要一个QPointer。如前所述,该类仅用于跟踪对象是否已在其他地方被删除。在这里,您可能根本不应该使用指针。只要做:

代码语言:javascript
复制
#include <QProcess>

class MyClass: public QObject {
private:
    QProcess m_process;
// ...

并将连接代码更改为:

代码语言:javascript
复制
connect(&m_process, &QProcess::errorOccurred, this, [](QProcess::ProcessError error)
{
    qDebug() << "error: " << error;
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55984789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档