获取 QString 时出现分段错误
Segmentation fault when getting QString
奇怪的问题,已经和几个同事一起调查过了...
使用 Qt Creator 和 Qt 4.8.5
- 定义对象
- 使用 setter 设置多个值
- 使用 getter 请求值
- 结果:得到一个 int 没问题,所有其他值都给出分段错误
- 但在调试器中使用断点后,值会正确显示,因此它们在对象中!
相同的代码之前工作,问题 "just appeared"。编译器问题?
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; }
进一步思考在内存中创建对象的方式,我认为 QString 可能不会保留固定数量的字节,这可能是导致这种奇怪行为的原因,你猜怎么着,一个虚拟更改解决了我的问题...
这感觉像是一个真正的 "dirty" 解决方案,但至少我可以继续我的工作 ;-)
但是任何关于根本原因的想法都将不胜感激!已经感谢所有宝贵意见!!!
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; }
我遇到了类似的问题。虽然我找不到这个问题的根本原因,但我有另一个观察。
如果我们使用范围解析运算符在 class 声明之外定义 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++ 中,如果我们在 class 声明中定义一个函数,默认情况下它是内联的...因此问题可能与函数的内联有关。
奇怪的问题,已经和几个同事一起调查过了... 使用 Qt Creator 和 Qt 4.8.5
- 定义对象
- 使用 setter 设置多个值
- 使用 getter 请求值
- 结果:得到一个 int 没问题,所有其他值都给出分段错误
- 但在调试器中使用断点后,值会正确显示,因此它们在对象中!
相同的代码之前工作,问题 "just appeared"。编译器问题?
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; }
进一步思考在内存中创建对象的方式,我认为 QString 可能不会保留固定数量的字节,这可能是导致这种奇怪行为的原因,你猜怎么着,一个虚拟更改解决了我的问题...
这感觉像是一个真正的 "dirty" 解决方案,但至少我可以继续我的工作 ;-) 但是任何关于根本原因的想法都将不胜感激!已经感谢所有宝贵意见!!!
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; }
我遇到了类似的问题。虽然我找不到这个问题的根本原因,但我有另一个观察。 如果我们使用范围解析运算符在 class 声明之外定义 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++ 中,如果我们在 class 声明中定义一个函数,默认情况下它是内联的...因此问题可能与函数的内联有关。