获取 QString 时出现分段错误

Posted

技术标签:

【中文标题】获取 QString 时出现分段错误【英文标题】:Segmentation fault when getting 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 :) 【参考方案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; 

【讨论】:

以上是关于获取 QString 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

将结构插入地图时出现分段错误

删除时出现分段错误

分配时出现分段错误[重复]

在 C++ 中使用向量时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11

返回指针时出现分段错误[重复]