重写枚举时的sigsegv

SIGSEGV when rewriting enums

本文关键字:sigsegv 枚举 重写      更新时间:2023-10-16

我在重写枚举时,我在分配运算符中获得sigsegv。
我的结构:

struct Pawn
{
private:
    Q_GADGET
public:
    Q_PROPERTY(Position position MEMBER m_position)
    Q_PROPERTY(PawnType pawnType MEMBER m_pawnType)
    Pawn() :  m_position(Position::NotDefined), m_pawnType(PawnType::None) {}
    Pawn(const Pawn &a_other)
    {
        this->m_pawnType = a_other.m_pawnType;
        this->m_position = a_other.m_position;
    }
    Pawn &operator=(const Pawn &a_other)
    {
        this->m_pawnType = a_other.m_pawnType;
        this->m_position = a_other.m_position;
        return *this;
    }
    ~Pawn(){}
    enum Position
    {
        NotDefined = 0,
        Bottom,
        Left,
        Top,
        Right
    };
    enum PawnType
    {
        None = 0,
        Circle,
        Square,
        Diamond,
        Triangle,
    };
    Q_ENUMS(Position)
    Q_ENUMS(PawnType)
    Position m_position;
    PawnType m_pawnType;
};

typedef Pawn::PawnType PawnType;
typedef Pawn::Position Position;
Q_DECLARE_METATYPE(Pawn)
Q_DECLARE_METATYPE(Pawn::Position)
Q_DECLARE_METATYPE(Pawn::PawnType)

导致错误的行:

m_board[a_pawnPosition.y()][a_pawnPosition.x()] = m_board[current.y()][current.x()];
m_board[current.y()][current.x()] = Pawn();

m_board的定义:

Pawn m_board[10][10];

a_pawnPositioncurrent处于边界

并不总是发生。我想q_property可能会导致它,但是我需要它们从QML读取值,并且不知道如何修复它。

你是对的。current不超出范围,因为它是参考,而不是复制的值,有时我以前从QList删除它。感谢您的回答。