Qt QObject cast上的分段故障
这些值类似于不为null,canconvert为true且有效。但在尝试投射时仍然会出现分段错误。我正在调试,在使用新值调用setValue之前,该值集可能已被删除Qt QObject cast上的分段故障,qt,Qt,这些值类似于不为null,canconvert为true且有效。但在尝试投射时仍然会出现分段错误。我正在调试,在使用新值调用setValue之前,该值集可能已被删除 QVariant m_model = 0; 是一个成员变量 void Handler::setValue(const QVariant &var) { bool isNull = m_model.isNull(); bool canConvert = m_model.canConvert<QObjec
QVariant m_model = 0;
是一个成员变量
void Handler::setValue(const QVariant &var)
{
bool isNull = m_model.isNull();
bool canConvert = m_model.canConvert<QObject*>();
bool isValid = m_model.isValid();
if(!m_model.isNull() && m_model.canConvert<QObject*>()) {
bool sConverts = (nullptr != m_model.value<QObject*>());
}
m_model = var;
}
void处理程序::setValue(const-QVariant&var)
{
bool isNull=m_model.isNull();
bool canConvert=m_model.canConvert();
bool isValid=m_model.isValid();
如果(!m_model.isNull()&&m_model.canConvert()){
boolsconverts=(nullptr!=m_model.value());
}
m_模型=var;
}
有人能告诉我为什么当m_模型中有一些数据时它会崩溃。首先,你的代码有一些问题:
QVariant::canConvert()
返回值的类型是否可以转换,而不是实际包含的值是否可以转换。示例:创建一个QVariant,其中QString作为值。调用myValue.canConvert()
将返回true,即使字符串是“无意义的”。这是因为QVariant通常能够将字符串(如“1.0”)转换为双精度值1.0
QVariant::isValid()
返回包含的类型是否为QMetaType::UnknownType
。这通常只在创建QVariant而不指定值时发生
QVariant m_model=0
将创建类型为int的QVariant。不要这样做。只需声明它,而不使用=0
部分。QVariant(与Qt中的其他值类型一样,如QString、QSize等)不需要初始化为null、空或无效。像这样声明它将使isValid()
返回true,尽管您可能希望它返回false
也就是说,我不确定您希望在代码片段中实现什么。基本上,您是在给m_模型分配一个新的未测试值var
之前对其进行测试的(为什么?)
正如您所说,您的值
var
(或可能包含的值)可能在调用setValue()
之前被删除。如果QObject已被删除,且指针未显式设置为nullptr
,则您正在处理一个QVariant,其中有一个指向该函数的悬空指针。由于setValue()
不测试新值var
,因此在m_模型中会有相同的悬空指针
,每次尝试访问时都会导致崩溃。在哪一行失败?