Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Segmentation Fault through signal SIGSEGV
Forum Updated to NodeBB v4.3 + New Features

Segmentation Fault through signal SIGSEGV

Scheduled Pinned Locked Moved General and Desktop
3 Posts 2 Posters 4.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    Agouri
    wrote on 20 May 2012, 18:12 last edited by
    #1

    Alright, this is something new to me. After googling around I found out that segmentation faults are given when the program is pointed to use memory that it doesn't have access to.

    I've recently started experiencing these errors after I tried making a custom button class that would enclose, in its clicked() signal, an integer.

    Here's the custom button class:
    .h:
    @#include <QtGui>

    #ifndef CUSTOMBUTTON_H
    #define CUSTOMBUTTON_H

    class CustomButton : public QPushButton //This simple class allows us to map arguments in the Widget's cicked() signal.
    { //In the project, it's used in the delete-edit buttons so the program knows which part of the Movie/Theater/Screening list we're referring to
    Q_OBJECT

    public:
    CustomButton(QString name,int num, QWidget *parent = 0);

    signals:
    void clicked(int pos);

    private:
    QSignalMapper *signalMapper;
    };

    #endif // CUSTOMBUTTON_H@

    .cpp:
    @#include "custombutton.h"

    CustomButton::CustomButton(QString name,int num = 0, QWidget *parent) //Our constructor
    : QPushButton(name,parent)
    { //Our button's now created and shown, through the superconstructor. Let's take care of its clicked() signal.

    signalMapper = new QSignalMapper(this);
    
    connect(this, SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(this, num);
    
    
    connect(signalMapper, SIGNAL(mapped(int)),this, SIGNAL(clicked(int)));
    

    }@

    And then in my main code I do:
    @CustomButton *edit_button = new CustomButton("Edit",i,0);
    edit_button->setFixedWidth(30);
    connect(edit_button,SIGNAL(clicked(int)),this,SLOT(edit_movie(int))); //When the user decides to edit a movie, we set the class'es working_with var to the position of the film in the MovieList and we set the screen to the appropriate one.

    CustomButton *del_button = new CustomButton("Delete",i,0); //We pass i as an argument to the button, so it can relate to the movie it's set next to.
    del_button->setFixedWidth(45);
    connect(del_button,SIGNAL(clicked(int)),this,SLOT(del_movie(int)));@

    Where i is the number I want it to have in the signal.

    Thing is, thorugh the debugger it doesn't give me a segfault if I press the Delete button. It all happens in the edit one.

    As I'm still pretty confused and in a situation where I don't even know WHAT to ask about, if you need anything else from me please say so and I will provide.

    Here's the backtrace:

    0 QHash<QObject*, QString>::findNode qhash.h 884 0x69e98594
    1 QHash<QObject*, QString>::contains qhash.h 874 0x69e98568
    2 QSignalMapper::map qsignalmapper.cpp 267 0x69debe0c
    3 QSignalMapper::map qsignalmapper.cpp 257 0x69debda2
    4 QSignalMapper::qt_static_metacall moc_qsignalmapper.cpp 64 0x69debfce
    5 QMetaObject::activate qobject.cpp 3547 0x69de9baf
    6 QAbstractButton::clicked moc_qabstractbutton.cpp 220 0x10cb4b8
    7 QAbstractButtonPrivate::emitClicked qabstractbutton.cpp 548 0xe2e517
    8 QAbstractButtonPrivate::click qabstractbutton.cpp 541 0xe2e495
    9 QAbstractButton::mouseReleaseEvent qabstractbutton.cpp 1123 0xe2f941
    10 QWidget::event qwidget.cpp 8362 0xae63de
    11 QAbstractButton::event qabstractbutton.cpp 1082 0xe2f7cc
    12 QPushButton::event qpushbutton.cpp 683 0xecfeba
    13 QApplicationPrivate::notify_helper qapplication.cpp 4554 0xa9c020
    14 QApplication::notify qapplication.cpp 4097 0xa9a26a
    15 QCoreApplication::notifyInternal qcoreapplication.cpp 876 0x69dd3b76
    16 QCoreApplication::sendSpontaneousEvent qcoreapplication.h 234 0x113137e
    17 QApplicationPrivate::sendMouseEvent qapplication.cpp 3163 0xa98ad6
    18 QETWidget::translateMouseEvent qapplication_win.cpp 3363 0xb03171
    19 QtWndProc qapplication_win.cpp 1696 0xafdf66
    20 USER32!IsDialogMessageW C:\Windows\syswow64\user32.dll 0 0x76726238
    21 USER32!RegisterSystemThread C:\Windows\syswow64\user32.dll 0 0x767278b0
    22 ?? 0 0x30000
    23 USER32!AllowForegroundActivation C:\Windows\syswow64\user32.dll 0 0x767268ea
    24 qt_is_translatable_mouse_event qapplication_win.cpp 1463 0xafd465
    25 USER32!GetMessageExtraInfo C:\Windows\syswow64\user32.dll 0 0x76727d31
    26 ?? 0

    And here is what

    1 Reply Last reply
    0
    • A Offline
      A Offline
      Agouri
      wrote on 20 May 2012, 18:15 last edited by
      #2

      Let me also note that if I don't run the program through the debugger, it sporadically crashes.

      Most of the time clicking the Edit button will take me where I want to be with no problem.
      Sometimes it crashes.

      1 Reply Last reply
      0
      • G Offline
        G Offline
        goetz
        wrote on 28 May 2012, 10:44 last edited by
        #3

        Why use a heavy weighted object like the signal mapper here? A much more simple approach would be to use a small protected slot that emits your signal:

        @

        class CustomButton : public QPushButton
        {
        Q_OBJECT

        public:
        CustomButton(QString name,int num, QWidget *parent = 0);

        signals:
        void clicked(int pos);

        private slots:
        void emitClickedWithInt();

        private:
        int myNumber;
        };

        CustomButton::CustomButton(QString name,int num, QWidget *parent)
        : QPushButton(name, parent), myNumber(num)
        {
        connect(this, SIGNAL(clicked()), this, SLOT(emitClickedWithInt()));
        }

        void CustomButton::emitClickedWithInt()
        {
        emit clicked(myNumber);
        }
        @

        http://www.catb.org/~esr/faqs/smart-questions.html

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved