类构造函数中指向 QProcess 对象的指针使 qt GUI 崩溃

Posted

技术标签:

【中文标题】类构造函数中指向 QProcess 对象的指针使 qt GUI 崩溃【英文标题】:pointer to QProcess object in class constructor crashes qt GUI 【发布时间】:2015-09-02 03:40:24 【问题描述】:

我有一个 qt GUI 应用程序,它包含一个从 QFrame 派生的小部件 DS9,用于打开和操作外部程序。该类的实现如下所示:

ds9.h

#ifndef DS9_H
#define DS9_H

#include <QFrame>
#include <QProcess>

class DS9 : public QFrame

    Q_OBJECT

public:
    explicit DS9(QWidget *parent = 0);
    ~DS9();  

signals:


public slots:
    void runDS9();

private:
    QProcess *ds9;
;

#endif // DS9_H

ds9.cpp

DS9::DS9(QWidget *parent):
    QFrame(parent)

    ds9 = new QProcess();
    ds9->setProgram("ds9");
    QStringList arguments;
    arguments << "-invert" << "-zscale";
    ds9->setArguments(arguments);


DS9::~DS9()

    delete ds9;


void DS9::runDS9()

    ds9->start();

但是,当运行程序时,不是显示 GUI,而是出现一个黑色(非空白)窗口并立即崩溃。错误消息如下所示:

*** Error in `./lightcurve_examiner': double free or corruption (out):        0x00000000013f0610 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x77a8d)[0x7f0a9dcada8d]
/lib64/libc.so.6(cfree+0x5cd)[0x7f0a9dcb9d2d]
/lib64  /libQt5Core.so.5(_ZN23QCoreApplicationPrivate16sendPostedEventsEP7QObjectiP11Q    ThreadData+0x2d0)[0x7f0a9efd0a20]
/lib64/libQt5Core.so.5(+0x2d9983)[0x7f0a9f024983]
/lib64/libglib-2.0.so.0(g_main_context_dispatch+0x15a)[0x7f0a9d2eca8a]
/lib64/libglib-2.0.so.0(+0x49e20)[0x7f0a9d2ece20]
/lib64/libglib-2.0.so.0(g_main_context_iteration+0x2c)[0x7f0a9d2ececc]
.....

但是,如果我不将 QProcess *ds9 设置为类的成员,即执行以下操作:

在.h中:

...
    private:
      //  QProcess *ds9;
...

在 .cpp 中:

void DS9::runDS9()

    QProcess * ds9 = new QProcess();
    ds9->setProgram("ds9");
    QStringList arguments;
    arguments << "-invert" << "-zscale";
    ds9->setArguments(arguments);
    ds9->start();

一切正常,即GUI正常启动,通过调用slot,程序被正确调用。

我的问题是,为什么我不能把 QProcess 对象作为类的成员?如果确实如此,我怎样才能保留指针并访问/重用它?

谢谢!

【问题讨论】:

我看到的唯一区别是一次删除,一次不删除进程对象。也许在 delete 前面放一个ds9-&gt;waitForFinished(),因为 delete 会终止进程,您可能想等到它自愿退出。能否请您制作一个简单的示例应用程序,我可以自己运行以检查错误。 尝试使用完整的调试信息获得更好的回溯。 删除你的构建文件夹,重新构建项目,看看它是否有效。如果仍然没有,那么您可能在构造 QApplication 之前创建了 DS9 实例? 谢谢库巴。重建项目工作!!我从没想过这会是问题所在。 【参考方案1】:

在我看来,您的 DS9 对象的生命周期可能存在问题,即它被删除得太快了,因此您的代码问题在您的课程之外。前几天我遇到了同样的问题,问题与我创建了一个在调用 QApplication::exec() 之前删除的 QProcess 的杂乱无章的测试代码有关。如果您还没有尝试过,我建议您从 QProcess 派生一个类,并向其析构函数和 DS9 的析构函数添加日志调用,或者查看是否可以在这些析构函数中添加断点并查看流程你的程序在外部。另外,您可能希望更改对 QProcess 的构造函数调用以将 DS9 对象添加为父对象,这样您就不必在 DS9 的析构函数中手动调用 delete。

祝你好运:)

【讨论】:

以上是关于类构造函数中指向 QProcess 对象的指针使 qt GUI 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

指向具有私有构造函数的类的类成员的指针

在 C++ 继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数

复制构造函数2——深入理解

如何获得指向类的复制构造函数的成员函数指针?

JavaScript-this指向继承(构造函数和原型对象)

我可以在所述对象的构造函数中创建指向对象的指针吗?