获取 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;
?也许编译器误解了你打算在那里做什么,因为name
、this->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 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章