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

标签 c++ qt user-interface qprocess

我有一个 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 正常启动,通过调用槽,程序被正确调用。

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

谢谢!

最佳答案

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

祝你好运:)

关于c++ - 类构造函数中指向 QProcess 对象的指针使 qt GUI 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32344287/

相关文章:

java - gwt bootstrap 中带有切换按钮的水平控制组

java - 如何在java GUI中锁定内部框架

c# - USB 如何创建可启动的自定义 USB 应用程序?

c++ - 为什么目标文件的 debug_str 这么大?

qt - QDoubleValidator 的 validate() 不起作用?

python - 用pyqtgraph添加新数据条最快的方法

c++ - QT UI双分割器

c++ - 了解 C++ 中的数据解析(对于新手程序员)

c++ - 在 vcpkg 和 CMake 中使用静态 Boost 库

c++ - 如何将 ANSI 格式文件转换为 Unicode