2016-05-15 45 views
8

例如,有一個函數可以找到一個對象,並在找到對象時返回shared_ptr,並且必須以某種方式指示沒有找到對象。返回null shared_ptr是否正確?

std::vector<std::shared_ptr> Storage::objects; 

std::shared_ptr<Object> Storage::findObject() 
{ 
    if (objects.find) 
    { 
    return objects[x]; 
    } 
    else 
    { 
    return nullptr; 
    } 
} 

std::shared_ptr<Object> obj = Storage::findObject(); 
if (obj) 
{ 
    print("found"); 
} 
else 
{ 
    print("not found"); 
} 
  1. 它是正確的在上面的示例與nullptr返回shared_ptr的隱式初始化什麼樣的?它會工作,但可以這樣做?或者我應該返回shared_ptr默認構造?

  2. 什麼情況下它會是weak_ptr?檢查空的weak_ptr已被返回的正確方法是什麼?通過weak_ptr :: expired函數還是有其他方法?如果通過weak_ptr :: expired檢查是唯一的方法,那麼我怎麼能區分該函數返回空指針,或者對象剛被刪除(多線程環境)?

+0

替代方案是拋出異常 –

+1

@AndersK。沒有找到對象的情況與找到對象一樣常見。 –

+0

好的,那麼異常並不是一個好的選擇。 –

回答

8

它是正確的在上面的示例與nullptr返回shared_ptr的隱式初始化什麼樣的?

是的,將shared_ptr初始化爲nullptr是正確的。將nullptr分配到shared_ptr也是正確的。

或者我應該返回shared_ptr默認構造?

您可以以兩種方式做到這一點:返回shared_ptr初始化nullptr以及返回默認shared_ptr構建。兩種方式都是正確的,兩者都有相同的效果。你可以使用任何你想要的方式。

什麼情況下它會是weak_ptr?檢查空的weak_ptr已被返回的正確方法是什麼?通過weak_ptr :: expired函數還是有其他方法?

weak_ptr變得nullptr(到期)每當與對象相關聯的最後shared_ptr被破壞。

weak_ptr工作的正確方法是將它與lock方法轉換爲shared_ptr,然後與創建shared_ptr工作。在這種情況下,您的weak_ptr將不會過期,直到您有新的shared_ptr。如果您沒有將weak_ptr轉換爲shared_ptr,則您的weak_ptr可能隨時過期。

是的,與新創建shared_ptr工作之前,必須檢查它不爲空,因爲weak_ptr可能你lock方法創建shared_ptr之前已經過期。

std::weak_ptr<Object> Storage::findObject(); 

... 

std::weak_ptr <Object> weak = Storage::findObject(); 
std::shared_ptr<Object> shared = weak.lock(); 
if (shared) // check that weak was not expired when we did "shared = weak.lock()" 
{ 
    // do something with shared, it will not expire. 
} 
相關問題