[英]Segmentation Fault on QObject cast
值就像不為空,canconvert 為真且有效。 但是在嘗試投射時仍然會出現分段錯誤。 我正在調試,並且可能在 setValue 使用新值調用之前刪除了值集。
QVariant m_model = 0;
是成員 var
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;
}
有人能說出為什么當 m_model 中仍有一些數據時它會崩潰。
首先你的代碼有一些問題:
QVariant::canConvert()
返回值的類型是否可轉換,而不是實際包含的值是否可以轉換。 示例:您使用 QString 作為值創建 QVariant。 調用myValue.canConvert<double>()
將返回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 。
也就是說,我不確定你想在你的代碼片段中實現什么。 基本上你在為它分配一個新的未經測試的值var
之前測試m_model
(為什么???)。
正如您所說,在調用setValue()
之前,您的值var
(或可能包含的值)可能已被刪除。 如果 QObject 已被刪除並且指針未明確設置為nullptr
您正在處理帶有懸空指針的 QVariant 函數。 由於setValue()
不測試新值var
您將在m_model
擁有相同的懸空指針,因此每當您嘗試訪問它時都會導致崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.