2015-10-22 42 views
1

当我使用继承(class NapanaApplication : public QGuiApplication)时,我的非常简单的例子发生了非常奇怪的行为,但是在直接使用QGuiApplication时没有崩溃并正常工作。C++ - 继承时的分段错误

该代码完全如下所示,NapanaApplication不做任何事情,只是继承自QGuiApplication

怎么了?

解决:我找到了一个理由。这是因为QGuiApplication采取argc作为参考,但NapanaApplication构造没有。它不会产生任何错误,但它会导致该QGuiApplication一些临时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 

napanapplication.c

#include "napanaapplication.h" 

NapanaApplication::NapanaApplication(int argc, char* argv[]) : QGuiApplication(argc, argv) {} 

调试器输出:在QString::fromLocal8Bit中调用strlen时崩溃。char*指针在其上strlen被称为具有价值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  
+0

崩溃什么错误? – Surt

+0

@Surt:分段错误(Signal SIGSEGV) – Krab

回答

7

Note the signature of QGuiApplication

QGuiApplication(int & argc, char ** argv) 

你的函数有int argc代替。我认为当整数值被父类构造函数视为引用时,会导致段错误。

+1

Oooo。这将做到这一点。错误的数字会导致错误的参数数量,导致未终结的char数组上的'strlen'。 – user4581301

+0

@ user4581301有趣的是,只有当你通过'app.exec()'启动事件循环时才会发生这种情况?我想在这之前Qt并没有检查一些参数。 –

+2

我看着源代码,这是因为Qt的存储的argc作为参考太,它们在构造函数中初始化它QtConstructor(INT&argcc):的argc(argcc)。如果他们将其存储为正常的int,则不会发生任何事情。 – Krab