类构造函数中指向 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->waitForFinished()
,因为 delete 会终止进程,您可能想等到它自愿退出。能否请您制作一个简单的示例应用程序,我可以自己运行以检查错误。
尝试使用完整的调试信息获得更好的回溯。
删除你的构建文件夹,重新构建项目,看看它是否有效。如果仍然没有,那么您可能在构造 QApplication
之前创建了 DS9
实例?
谢谢库巴。重建项目工作!!我从没想过这会是问题所在。
【参考方案1】:
在我看来,您的 DS9 对象的生命周期可能存在问题,即它被删除得太快了,因此您的代码问题在您的课程之外。前几天我遇到了同样的问题,问题与我创建了一个在调用 QApplication::exec() 之前删除的 QProcess 的杂乱无章的测试代码有关。如果您还没有尝试过,我建议您从 QProcess 派生一个类,并向其析构函数和 DS9 的析构函数添加日志调用,或者查看是否可以在这些析构函数中添加断点并查看流程你的程序在外部。另外,您可能希望更改对 QProcess 的构造函数调用以将 DS9 对象添加为父对象,这样您就不必在 DS9 的析构函数中手动调用 delete。
祝你好运:)
【讨论】:
以上是关于类构造函数中指向 QProcess 对象的指针使 qt GUI 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数