C ++-继承时的分段错误 [英] C++ - segmentation fault when inheritance

查看:50
本文介绍了C ++-继承时的分段错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的一个非常简单的示例产生了非常奇怪的行为,该示例在使用继承时崩溃(类NapanaApplication:公共QGuiApplication ),但在直接使用 QGuiApplication .

代码完全如下所示, 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); *///分段错误QGuiApplication app(argc,argv);//没有错误NapanaWindow获胜;win.resize(800,600);win.show();返回app.exec();} 

napanaapplication.h

 <代码> #ifndef NAPANAAPPLICATION_H#define NAPANAAPPLICATION_H#include< QGuiApplication>NapanaApplication类:公共QGuiApplication{Q_OBJECT上市:明确的NapanaApplication(int argc,char * argv []);信号:公共插槽:};#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 0x7ffff65c0aea1 QString :: fromLocal8Bit qstring.h 534 0x7ffff7142c112 QCoreApplication ::参数qcoreapplication.cpp 2254 0x7ffff738503d3 sm_performSaveYourself qxcbsessionmanager.cpp 188 0x7ffff05f5e3a4 sm_saveYourselfCallback qxcbsessionmanager.cpp 171 0x7ffff05f5cc95 _SmcProcessMessage 0x7ffff014ad376 IceProcessMessages 0x7fffeff3b8c77 QSmSocketReceiver :: socketActivated qxcbsessionmanager.cpp 322 0x7ffff05f67e08 QSmSocketReceiver :: qt_static_metacall qxcbsessionmanager.moc 68 0x7ffff05f6f889 QMetaObject ::激活qobject.cpp 3718 0x7ffff73c097e10 QMetaObject ::激活qobject.cpp 3583 0x7ffff73c016c11 QSocketNotifier ::已激活moc_qsocketnotifier.cpp 134 0x7ffff745837612 QSocketNotifier :: event qsocketnotifier.cpp 296 0x7ffff73cb4db13 QCoreApplicationPrivate :: notify_helper qcoreapplication.cpp 1093 0x7ffff738287214 QCoreApplication ::通知qcoreapplication.cpp 1038 0x7ffff738255415 QGuiApplication ::通知qguiapplication.cpp 1537 0x7ffff77f307616 QCoreApplication :: notify内部qcoreapplication.cpp 965 0x7ffff738245e17 QCoreApplication :: sendEvent qcoreapplication.h 224 0x7ffff738608718 socketNotifierSourceDispatch qeventdispatcher_glib.cpp 101 0x7ffff73f6afe19 g_main_context_dispatch 0x7ffff4f8dbd420 ??0x7ffff4f8de1821 g_main_context_iteration 0x7ffff4f8debc22 QEventDispatcherGlib :: processEvents qeventdispatcher_glib.cpp 418 0x7ffff73f779923 QPAEventDispatcherGlib :: processEvents qeventdispatcher_glib.cpp 115 0x7ffff064890624 QEventLoop :: processEvents qeventloop.cpp 128 0x7ffff737f0b225 QEventLoop :: exec qeventloop.cpp 204 0x7ffff737f37326 QCoreApplication :: exec qcoreapplication.cpp 1229 0x7ffff7382b3627 QGuiApplication :: exec qguiapplication.cpp 1528 0x7ffff77f302628主main.cpp 13 0x40275a 

解决方案

请注意签名QGuiApplication :

  QGuiApplication(int& argc,char ** argv) 

您的函数使用的是 int argc .我认为当父类构造函数将整数值当作参考时,会导致段错误.

I got very strange behaviour with my very simple example which crashes when i use inheritance (class NapanaApplication : public QGuiApplication), but doesn't crash and works properly when using directly QGuiApplication.

The code is exactly as seen below, the NapanaApplication doesn't do anything, just inherits from QGuiApplication.

What's wrong?

SOLVED: I found a reason. It is because the QGuiApplication takes the argc as reference, but the NapanaApplication constructor doesn't. It doesn't generate any error, but it causes that the QGuiApplication operated with some temporary argc variable instead of the one from 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) {}

Output from debugger: it crashes when strlen is called in QString::fromLocal8Bit. The char* pointer on which the strlen is called has value 0x21, i don't understand why, it should be probably something from 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    

解决方案

Note the signature of QGuiApplication:

QGuiApplication(int & argc, char ** argv)

Your function has int argc instead. I think you're causing a segfault when the integer value is then treated as a reference by the parent class constructor.

这篇关于C ++-继承时的分段错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆