返回私人会员时出错

Segfault when returning private member

本文关键字:出错 返回      更新时间:2023-10-16

我在调试代码时遇到问题。在某些Qt插槽中,我这样做:

UIElementInterface* interface = qobject_cast <UIElementInterface*>(sender());

下面这一行给了我一个分段错误:

QStringList data = interface->getSetDefData();

这不行

QString hello = interface->getHello();

UIElementInterface内部getSetDefData()的实现:

class UIElementInterface
{
public:
    ...
    UIElementInterface(const QStringList& data) : m_setDefData(data)
    {
        std::cout << qPrintable(m_setDefData[0]) << std::endl; //everything as expected here..
    }
    QStringList getSetDefData(){return m_setDefData;} //gives seg fault
    QString getHello(){return QString("Hello");} //works fine
private:
    QStringList m_setDefData;
};

我将不胜感激:)

编辑根据我qobject_cast投向CheckBox的评论,这绝对是发送者(在崩溃的情况下),它是一个子类QCheckBox。所以它肯定是QObject(我也仔细检查了实现)。当我按照建议检查返回值时,结果是0.

CheckBox* b = qobject_cast<CheckBox*>(sender());
if (b == 0)
{
    std::cout << "Here we are" << std::endl;
}

所以这就是问题所在。我仍然需要弄清楚为什么会这样,但这可能会导致崩溃。

另一个编辑 打印出类名sender()->metaObject()->className()揭露邪恶的根源:

QSignalMapper

结案:)

UIElementInterface类声明中可以清楚地看出,该类不是QObject。关于qobject_cast函数的Qt文档指出:

类 T 必须(直接或间接)继承 QObject 并且 使用 Q_OBJECT 宏声明。

因此,您不能将qobject_castUIElementInterface类一起使用。