C++ Qt创建者:通过SIGSEGV(C+;+;)的分段错误

C++ Qt创建者:通过SIGSEGV(C+;+;)的分段错误,c++,qt,segmentation-fault,C++,Qt,Segmentation Fault,在谷歌搜索之后,我发现当程序被指向使用它无法访问的内存时,就会出现分段错误 在我尝试创建一个自定义按钮类,该类将在其clicked()信号中包含一个整数之后,我最近开始遇到这些错误 以下是自定义按钮类: .h: 然后在我的主要代码中,我会: CustomButton *edit_button = new CustomButton("Edit",i,0); edit_button->setFixedWidth(30); connect(edit_button,SIGNAL(clicked(i

在谷歌搜索之后,我发现当程序被指向使用它无法访问的内存时,就会出现分段错误

在我尝试创建一个自定义按钮类,该类将在其clicked()信号中包含一个整数之后,我最近开始遇到这些错误

以下是自定义按钮类:

.h: 然后在我的主要代码中,我会:

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)));
其中i是我希望信号中包含的号码

问题是,通过调试器,如果我按下删除按钮,它不会给我一个segfault。这一切都发生在编辑过程中

因为我仍然很困惑,我甚至不知道该问些什么,如果你还需要我做什么,请告诉我,我会提供

这是回溯,我不知道怎么读:

0 QHash<QObject*, QString>::findNode qhash.h 884 0×69e98594
1 QHash<QObject*, QString>::contains qhash.h 874 0×69e98568
2 QSignalMapper::map qsignalmapper.cpp 267 0×69debe0c
3 QSignalMapper::map qsignalmapper.cpp 257 0×69debda2
4 QSignalMapper::qt_static_metacall moc_qsignalmapper.cpp 64 0×69debfce
5 QMetaObject::activate qobject.cpp 3547 0×69de9baf
6 QAbstractButton::clicked moc_qabstractbutton.cpp 220 0×10cb4b8
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 0×69dd3b76
16 QCoreApplication::sendSpontaneousEvent qcoreapplication.h 234 0×113137e
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 0×76726238
21 USER32!RegisterSystemThread C:\Windows\syswow64\user32.dll 0 0×767278b0
22 ?? 0 0×30000
23 USER32!AllowForegroundActivation C:\Windows\syswow64\user32.dll 0 0×767268ea
24 qt_is_translatable_mouse_event qapplication_win.cpp 1463 0xafd465
25 USER32!GetMessageExtraInfo C:\Windows\syswow64\user32.dll 0 0×76727d31
26 ?? 0 
0 QHash::findNode QHash.h 884 0×69e98594
1 QHash::包含QHash.h 874 0×69e98568
2 QSignalMapper::map QSignalMapper.cpp 267 0×69debe0c
3 QSignalMapper::map QSignalMapper.cpp 257 0×69debda2
4 QSignalMapper::qt_static_metacall moc_QSignalMapper.cpp 64 0×69debfce
5 QMetaObject::激活qobject.cpp 3547 0×69de9baf
6 QAbstractButton::单击moc_QAbstractButton.cpp 220 0×10cb4b8
7 QAbstractButtonPrivate::emitClicked qabstractbutton.cpp 548 0xe2e517
8 QAbstractButtonPrivate::单击qabstractbutton.cpp 541 0xe2e495
9 QAbstractButton::mouseReleaseEvent QAbstractButton.cpp 1123 0xe2f941
10 QWidget::event QWidget.cpp 8362 0xae63de
11 QAbstractButton::事件QAbstractButton.cpp 1082 0xe2f7cc
12 QPushButton::事件QPushButton.cpp 683 0xecfeba
13 QApplicationPrivate::notify_helper qapplication.cpp 4554 0xa9c020
14 QApplication::通知QApplication.cpp 4097 0xa9a26a
15 QCoreApplication::notify内部QCoreApplication.cpp 876 0×69dd3b76
16 QCoreApplication::sendsuncurevent QCoreApplication.h 234 0×113137e
17 QApplicationPrivate::sendMouseEvent qapplication.cpp 3163 0xa98ad6
18 QETWidget::translateMouseEvent qapplication_win.cpp 3363 0xb03171
19 QtWndProc qapplication_win.cpp 1696 0xafdf66
20个用户32个!IsDialogMessageW C:\Windows\syswow64\user32.dll 0×76726238
21用户32!注册表系统线程C:\Windows\syswow64\user32.dll 0 0×767278b0
22 ?? 0 0×30000
23用户32!AllowForegroundActivation C:\Windows\syswow64\user32.dll 0 0×767268ea
24 qt可翻译鼠标事件qapplication.cpp 1463 0xafd465
25个用户32个!GetMessageExtraInfo C:\Windows\syswow64\user32.dll 0×76727d31
26 ?? 0
有人知道是什么导致了问题吗?正如我所说的,只有当我通过调试器运行程序并按下CustomButton类的“Edit”按钮时,才会发生segfault当我正常构建和运行时,程序工作9/10次。有时,单击“编辑”按钮会导致崩溃。这种不稳定的行为正是我在这里寻求帮助的原因。


当我点击按钮时,我被带到了一个新的屏幕,我怀疑问题可能在于解构器?当实际对象被传递给基类构造函数时,空析构函数是否正确地解构CustomButton类对象的元素?也许我在那里有漏洞?

除非知道在哪里创建对象,否则很难知道为什么QSignalMapper中有segfault。指向信号映射器的指针在某个时间点可能无效,因此可能存在不必要的删除

在某些情况下,完全重建应用程序可能会有所帮助。同时重新运行qmake。当你不能解释为什么会有SEGFULT时,应该在你的清单上……;)

QSignalMapper还有一个替代方案:保持信号被点击(int)并实现一个专用插槽:

private slots:
    this_clicked() {
        emit clicked(num);
    }
然后放入构造函数:

connect(this, SIGNAL(clicked()), SLOT(this_clicked()));

除非知道在何处创建对象,否则很难说为什么QSignalMapper中存在segfault。指向信号映射器的指针在某个时间点可能无效,因此可能存在不必要的删除

在某些情况下,完全重建应用程序可能会有所帮助。同时重新运行qmake。当你不能解释为什么会有SEGFULT时,应该在你的清单上……;)

QSignalMapper还有一个替代方案:保持信号被点击(int)并实现一个专用插槽:

private slots:
    this_clicked() {
        emit clicked(num);
    }
然后放入构造函数:

connect(this, SIGNAL(clicked()), SLOT(this_clicked()));

欢迎来到StackOverflow!我想我们需要更多的代码,因为我看不出你们班有任何错误。请在使用类的位置添加更多代码。也许最好将父指针传递给CustomButton实例。(我猜你是在另一个小部件中创建的。)@Dimitris:堆栈跟踪显示它在QSignalMapper中退出,我一眼就看不出有任何错误,所以我可以问一下你为什么使用它吗?@Leems我的整个项目相当大,我最不想让你们疏远或厌倦的是让你们接触我的大量代码。我已经把问题缩小到这里了。如果你想看更多的话,这里就是全部。发生这种情况的情况是showScreen()中开关的情况3:尝试将“this”作为父级传递,问题仍然存在。也谢谢你的欢迎。事实上,我大致可以看出这个问题,QSignalMapper在它自己的上下文中是一个有用的工具,但我认为它不适合您在创建多个映射器时使用它的方式,所以,你不是用一个映射器来映射多个按钮,而是用多个映射器来映射一个按钮。@NicholasSmith为什么我用QSignalMapper?我对整个signal&slot系统还不熟悉,在谷歌搜索和阅读教程之后,似乎用信号传递参数的唯一方法(在我的项目中,用按钮的clicked()信号传递数字)是自己使用signalMapper对象将值映射到自定义信号。不知为什么,我把事情搞砸了吗?还有别的方法吗?欢迎来到StackOverflow!我想我们需要更多的代码,因为我看不出你们班有任何错误。请添加mor