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

时间:2019-05-04 16:53:17

标签: c++ qt c++14 qpointer

假设我有一个类似以下的类:

#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
QObject::connect(m_process, &QProcess::errorOccurred,
            this, [](QProcess::ProcessError error) {
            qDebug() << "error: " << error;
            });

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

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

  

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

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

还是我误会了?

2 个答案:

答案 0 :(得分:2)

LocalDateTime claimeffectiveDate = LocalDateTime.now().with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)); constructedAddreopenClaims.setClaimeffectiveDate(claimeffectiveDate); 的目的是提供一个指向QPointer子类的受保护或弱指针。当对象超出范围时,它不会删除它,只是知道它指向的对象是活动的还是已删除。

因此,您当前的代码在这种意义上是正确的。一些评论:

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

答案 1 :(得分:1)

QPointer不是一个聪明的指针。它不管理它指向的对象。它只是跟踪它是否被删除。您需要自己删除它:

~MyClass()
{
    delete m_process.data();
}

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

您不需要在删除它之前检查它是否为空,因为删除一个空指针是可以的(只是不做任何事情。)

不过,我认为您不需要QPointer。如前所述,此类仅用于跟踪对象是否已在其他位置删除。您可能根本不应该使用指针。只要做:

#include <QProcess>

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

并将您的连接代码更改为:

connect(&m_process, &QProcess::errorOccurred, this, [](QProcess::ProcessError error)
{
    qDebug() << "error: " << error;
});