簡體   English   中英

QObject 轉換上的分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM