获取QString时出现分段错误

Segmentation fault when getting QString

本文关键字:分段 错误 QString 获取      更新时间:2023-10-16

这个奇怪的问题,已经和几个同事研究过了。。。使用Qt Creator和Qt 4.8.5

  • 定义对象
  • 使用setter设置多个值
  • 使用getter请求值
  • 结果:得到一个int没有问题,所有其他值都会导致分段错误
  • 但是使用调试器中的断点,值会正确显示,因此它们在对象中
  • 同样的代码以前工作,问题"刚刚出现"。编译器问题?

    private:
        int id;
        QString name;
    public;
       int getId() { return this->id; } // OK
       void setId(int id) { this->id = id; } 
       QString getName() { return this->name; } // SIGSEGV
       void setName(QString name) { this->name = name; }
    

有什么想法吗?知道同样的问题吗?

更新

更改了代码,基于评论,仍然是相同的问题

    private:
        int id;
        QString name;
    public;
       int getId() { return id; } // OK
       void setId(int setTo) { id = setTo; } 
       QString getName() { return name; } // SIGSEGV
       void setName(QString setTo) { name = setTo; }

我也面临类似的问题。虽然我找不到这个问题的根本原因,但我有另一个观察。如果我们使用范围解析运算符在类声明之外定义getter函数,那么代码就可以工作了。

QString MyClass::GetX(void) {
    return mX;
}
QString MyClass::GetY(void) {
    return mY;
}
class MyClass
{
public:
    MyClass(){}
    /* Functions for setting mX and mY strings. */
    QString GetX(void);
    QString GetY(void);
    isDataAvailable()
    {
        return mAvailable;
    }
private:
    bool mAvailable;
    QString mX;
    QString mY;
};

正如我所理解的,在C++中,如果我们在类声明中定义一个函数,默认情况下它是内联的。。。因此,问题可能与函数的内联有关。

进一步思考在内存中创建对象的方式,我认为QString可能没有保留固定数量的字节,这可能是这种奇怪行为的原因,你猜怎么着,一个伪更改解决了我的问题。。。

这感觉是一个非常"肮脏"的解决方案,但至少我可以继续我的工作;-)但任何关于根本原因的想法都将不胜感激!感谢所有宝贵的评论!!!

private:
    QString name; // FIRST DEFINE QSTRING
    int id; // THEN DEFINE INT
public;
   int getId() { return id; } // OK
   void setId(int setTo) { id = setTo; } 
   QString getName() { return name; } // OK
   void setName(QString setTo) { name = setTo; }