C++ C++;-继承时的分段错误

C++ C++;-继承时的分段错误,c++,qt,C++,Qt,我的示例非常简单,当我使用继承时(classnapanaapplication:publicqguiapplication)会崩溃,但在直接使用QGuiApplication时不会崩溃并正常工作 代码如下所示,napana应用程序没有做任何事情,只是从qgui应用程序继承 怎么了 解决:我找到了一个原因。这是因为QGuiApplication将argc作为参考,但NapanaApplication构造函数没有。它不会生成任何错误,但会导致qgui应用程序使用一些临时argc变量而不是main中的

我的示例非常简单,当我使用继承时(
classnapanaapplication:publicqguiapplication
)会崩溃,但在直接使用
QGuiApplication
时不会崩溃并正常工作

代码如下所示,
napana应用程序
没有做任何事情,只是从
qgui应用程序
继承

怎么了

解决:我找到了一个原因。这是因为
QGuiApplication
argc
作为参考,但
NapanaApplication
构造函数没有。它不会生成任何错误,但会导致
qgui应用程序
使用一些临时
argc
变量而不是
main
中的变量进行操作

main.cpp

#include "napanaapplication.h"
#include "napanawindow.h"

int main(int argc, char* argv[]) {

    /*NapanaApplication app(argc, argv);*/ // segmentation fault

    QGuiApplication app(argc, argv); // no error        

    NapanaWindow win;

    win.resize(800, 600);
    win.show();

    return app.exec();
}
napanaapplication.h

#ifndef NAPANAAPPLICATION_H
#define NAPANAAPPLICATION_H

#include <QGuiApplication>

class NapanaApplication : public QGuiApplication
{

    Q_OBJECT

public:
    explicit NapanaApplication(int argc, char* argv[]);
signals:

public slots:
};

#endif // NAPANAAPPLICATION_H
调试器的输出:在
QString::fromLocal8Bit
中调用
strlen
时,调用
strlen
char*
指针上有值
0x21
,我不明白为什么,它可能来自
argv

0   strlen  /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so    106 0x7ffff65c0aea  
1   QString::fromLocal8Bit  qstring.h   534 0x7ffff7142c11  
2   QCoreApplication::arguments qcoreapplication.cpp    2254    0x7ffff738503d  
3   sm_performSaveYourself  qxcbsessionmanager.cpp  188 0x7ffff05f5e3a  
4   sm_saveYourselfCallback qxcbsessionmanager.cpp  171 0x7ffff05f5cc9  
5   _SmcProcessMessage          0x7ffff014ad37  
6   IceProcessMessages          0x7fffeff3b8c7  
7   QSmSocketReceiver::socketActivated  qxcbsessionmanager.cpp  322 0x7ffff05f67e0  
8   QSmSocketReceiver::qt_static_metacall   qxcbsessionmanager.moc  68  0x7ffff05f6f88  
9   QMetaObject::activate   qobject.cpp 3718    0x7ffff73c097e  
10  QMetaObject::activate   qobject.cpp 3583    0x7ffff73c016c  
11  QSocketNotifier::activated  moc_qsocketnotifier.cpp 134 0x7ffff7458376  
12  QSocketNotifier::event  qsocketnotifier.cpp 296 0x7ffff73cb4db  
13  QCoreApplicationPrivate::notify_helper  qcoreapplication.cpp    1093    0x7ffff7382872  
14  QCoreApplication::notify    qcoreapplication.cpp    1038    0x7ffff7382554  
15  QGuiApplication::notify qguiapplication.cpp 1537    0x7ffff77f3076  
16  QCoreApplication::notifyInternal    qcoreapplication.cpp    965 0x7ffff738245e  
17  QCoreApplication::sendEvent qcoreapplication.h  224 0x7ffff7386087  
18  socketNotifierSourceDispatch    qeventdispatcher_glib.cpp   101 0x7ffff73f6afe  
19  g_main_context_dispatch         0x7ffff4f8dbd4  
20  ??          0x7ffff4f8de18  
21  g_main_context_iteration            0x7ffff4f8debc  
22  QEventDispatcherGlib::processEvents qeventdispatcher_glib.cpp   418 0x7ffff73f7799  
23  QPAEventDispatcherGlib::processEvents   qeventdispatcher_glib.cpp   115 0x7ffff0648906  
24  QEventLoop::processEvents   qeventloop.cpp  128 0x7ffff737f0b2  
25  QEventLoop::exec    qeventloop.cpp  204 0x7ffff737f373  
26  QCoreApplication::exec  qcoreapplication.cpp    1229    0x7ffff7382b36  
27  QGuiApplication::exec   qguiapplication.cpp 1528    0x7ffff77f3026  
28  main    main.cpp    13  0x40275a    
:

您的函数改为
int argc
。当父类构造函数将整数值视为引用时,我认为您导致了SEGFULT。

:


您的函数改为
int argc
。我认为,当父类构造函数将整数值视为引用时,您导致了SEGFULT。

崩溃的原因是什么?@Surt:segmentation fault(Signal SIGSEGV)崩溃的原因是什么?@Surt:segmentation fault(Signal SIGSEGV)ooo。那就行了。错误的数字会导致错误的参数数量,导致未终止的字符数组上出现
strlen
。@user4581301有点奇怪,它只有在通过
app.exec()
启动事件循环时才会发生?我猜Qt在此之前没有检查一些参数。我查看了源代码,这是因为Qt也将argc存储为引用,所以它们在构造函数QtConstructor(int&argcc):argc(argcc)中初始化它。如果他们将其存储为普通int,则不会发生任何事情。那就行了。错误的数字会导致错误的参数数量,导致未终止的字符数组上出现
strlen
。@user4581301有点奇怪,它只有在通过
app.exec()
启动事件循环时才会发生?我猜Qt在此之前没有检查一些参数。我查看了源代码,这是因为Qt也将argc存储为引用,所以它们在构造函数QtConstructor(int&argcc):argc(argcc)中初始化它。如果他们将其存储为正常int,则不会发生任何事情。
0   strlen  /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so    106 0x7ffff65c0aea  
1   QString::fromLocal8Bit  qstring.h   534 0x7ffff7142c11  
2   QCoreApplication::arguments qcoreapplication.cpp    2254    0x7ffff738503d  
3   sm_performSaveYourself  qxcbsessionmanager.cpp  188 0x7ffff05f5e3a  
4   sm_saveYourselfCallback qxcbsessionmanager.cpp  171 0x7ffff05f5cc9  
5   _SmcProcessMessage          0x7ffff014ad37  
6   IceProcessMessages          0x7fffeff3b8c7  
7   QSmSocketReceiver::socketActivated  qxcbsessionmanager.cpp  322 0x7ffff05f67e0  
8   QSmSocketReceiver::qt_static_metacall   qxcbsessionmanager.moc  68  0x7ffff05f6f88  
9   QMetaObject::activate   qobject.cpp 3718    0x7ffff73c097e  
10  QMetaObject::activate   qobject.cpp 3583    0x7ffff73c016c  
11  QSocketNotifier::activated  moc_qsocketnotifier.cpp 134 0x7ffff7458376  
12  QSocketNotifier::event  qsocketnotifier.cpp 296 0x7ffff73cb4db  
13  QCoreApplicationPrivate::notify_helper  qcoreapplication.cpp    1093    0x7ffff7382872  
14  QCoreApplication::notify    qcoreapplication.cpp    1038    0x7ffff7382554  
15  QGuiApplication::notify qguiapplication.cpp 1537    0x7ffff77f3076  
16  QCoreApplication::notifyInternal    qcoreapplication.cpp    965 0x7ffff738245e  
17  QCoreApplication::sendEvent qcoreapplication.h  224 0x7ffff7386087  
18  socketNotifierSourceDispatch    qeventdispatcher_glib.cpp   101 0x7ffff73f6afe  
19  g_main_context_dispatch         0x7ffff4f8dbd4  
20  ??          0x7ffff4f8de18  
21  g_main_context_iteration            0x7ffff4f8debc  
22  QEventDispatcherGlib::processEvents qeventdispatcher_glib.cpp   418 0x7ffff73f7799  
23  QPAEventDispatcherGlib::processEvents   qeventdispatcher_glib.cpp   115 0x7ffff0648906  
24  QEventLoop::processEvents   qeventloop.cpp  128 0x7ffff737f0b2  
25  QEventLoop::exec    qeventloop.cpp  204 0x7ffff737f373  
26  QCoreApplication::exec  qcoreapplication.cpp    1229    0x7ffff7382b36  
27  QGuiApplication::exec   qguiapplication.cpp 1528    0x7ffff77f3026  
28  main    main.cpp    13  0x40275a    
QGuiApplication(int & argc, char ** argv)