2013-06-02 43 views
-1

當使用XCode 4.6分析代碼時出現此警告,但我沒有得到它。訪問字段導致空指針取消引用

VanishingPointInfo* vpClosestToCenterLine = NULL; 
    for (vector<VanishingPointInfo>::iterator vpInfo = lineCrossings.begin(); vpInfo != lineCrossings.end(); vpInfo++) 
    { 
     if (vpClosestToCenterLine == NULL || vpInfo->diffToMiddle < vpClosestToCenterLine->diffToMiddle) 
     { 
      vpClosestToCenterLine = &(*vpInfo); 
     } 
    } 

的XCode抱怨在NULL指針的間接引用的訪問vpInfo->diffToMiddle結果。但是這是迭代器...

+0

1.什麼是vpInfo? 2.出於好奇,嘗試'(* vpInfo).'而不是'vpInfo->' – Spook

+0

你確定它不是'vpClosestToCenterLine-> diffToMiddle',因爲它不知道它是否不再爲空? – Djon

+0

@Djon:我不這麼認爲,因爲如果它是'NULL',它不能進入​​'if'的'||'的第二部分。 –

回答

0

如果vpInfo具有空值,Xcode正在標記該消息以警告該錯誤,如果它發生錯誤,那麼vpInfo中的子結構都是無效的。要修復警告,您可以在通過需要訪問子結構的邏輯之前進行存在檢查。 ...

if (vpInfo) { 
     VanishingPointInfo* vpClosestToCenterLine = NULL; 
for (vector<VanishingPointInfo>::iterator vpInfo = lineCrossings.begin(); vpInfo != lineCrossings.end(); vpInfo++) 
{ 
    if (vpClosestToCenterLine == NULL || vpInfo->diffToMiddle < vpClosestToCenterLine->diffToMiddle) 
    { 
     vpClosestToCenterLine = &(*vpInfo); 
    } 
}} 
+0

'for'循環塊中'vpInfo'不能爲空。 – Shoe

+1

這也許是真的,但新的編譯器/分析器不知道,並期望存在檢查。我用第三方庫(pnglib)得到了很多這些消息,早期的Xcode版本不檢查這個,但他們現在就做。 – Paulo