【问题标题】:Accessing class members causing segmentation fault访问导致分段错误的类成员
【发布时间】:2015-03-27 16:52:17
【问题描述】:

我的类“ComponentArea”如下所示:

#ifndef COMPONENTAREA_H
#define COMPONENTAREA_H

#include <QObject>
#include <QWidget>
#include <QScrollArea>
#include <QtDesigner/QtDesigner>
#include <QMouseEvent>
#include <QPainter>

#include <Components/Sockets/socket.h>

class ComponentArea : public QScrollArea
{
Q_OBJECT

public:
    ComponentArea(QWidget* parent = 0);
    void connectSockets(Socket* a, Socket* b);
    void childBlock_childSocket_mousePressEvent(Socket* sender, QMouseEvent* event);
    void childBlock_childSocket_mouseReleaseEvent(Socket* sender, QMouseEvent* event);

private:

    Socket* pressedSocket;
    void mouseReleaseEvent(QMouseEvent *event);
};

#endif // COMPONENTAREA_H

在构造函数中,我将pressedSocket设置为0:

pressedSocket = 0;

每当我尝试使用pressedSocket 时,在其中一个事件中,我都会收到分段错误:

void ComponentArea::childBlock_childSocket_mousePressEvent(Socket *sender, QMouseEvent *event)
{
    if((pressedSocket == 0) && (event->button() == Qt::LeftButton)) //SIGSEGV here
    {
        pressedSocket = sender;
    }
}

我对每个成员都有这种效果,即使是简单的布尔值。 我看不出我做错了什么。有什么建议吗?提前致谢!

【问题讨论】:

  • 您的ComponentArea 对象无效。
  • 什么时候出现段错误?在分配时,或稍后,当您尝试使用该值时?
  • 从哪里调用这个函数?

标签: c++ qt


【解决方案1】:

可能是“释放后使用”问题,这意味着您正在尝试访问已被删除的对象。你检查了吗?

例如在 SIGSEGV 发生的行放置一个断点。检查您的 pressedSocket 成员的 this 指针和值。如果幸运的话,它会有一个模糊的值,例如“0xfeeefeee”——在这种情况下,您的对象不再存在,因此您无法访问那里的任何内容。

否则,您可能会尝试取消引用 NULL 指针,在这种情况下,this 显示为“0x00000000”之类的内容。 (正如 János Roden 刚刚指出的那样。)

【讨论】:

    【解决方案2】:

    thisevent 可能为空。检查你是否实例化了你的类。

    如果您在 linux 上开发,那么您可以使用Valgrind 运行您的程序。它会准确地说出问题所在,只需仔细阅读其消息即可。

    【讨论】:

      猜你喜欢
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多