我有一个 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/