【问题标题】:Segmentation fault when getting QString获取 QString 时出现分段错误
【发布时间】:2015-02-25 09:11:31
【问题描述】:

奇怪的问题,已经和几个同事一起研究过... 使用 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; }
    

有什么想法吗?已知相同的问题?

更新

根据 cmets 将代码改成这个,还是一样的问题

    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; }

【问题讨论】:

  • 您最近是否更新了 Qt 库?可能正在使用错误版本的库。尝试暂时删除(重命名)任何可能的冲突库。
  • this->name = name;?也许编译器误解了你打算在那里做什么,因为namethis->name 和局部变量name 冲突?
  • 尝试评论this->name = name;,看看问题是否仍然存在。另外,在调用 getJourneyName() 之前是否删除了 this
  • @Frank,this->id = id; 也是如此。尝试评论它以及this->name = name
  • 我猜你需要在这里提供一个minimal reproducible code :)

标签: c++ qt segmentation-fault qt4.8


【解决方案1】:

我遇到了类似的问题。虽然我找不到这个问题的根本原因,但我有另一个观察。 如果我们使用作用域解析运算符在类声明之外定义 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++ 中,如果我们在类声明中定义一个函数,默认情况下它是内联的……所以问题可能与函数的内联有关。

【讨论】:

  • 我认为AngryDuck 建议了相同的解决方案......对我来说它有效。后来看到评论。
【解决方案2】:

进一步考虑在内存中创建对象的方式,我认为 QString 可能不会保留固定数量的字节,这可能是导致这种奇怪行为的原因,猜猜看,一个虚拟的更改解决了我的问题.. .

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

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; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2020-11-15
    相关资源
    最近更新 更多