安全

2011-01-20 88 views
1

我的問題是,如何故障保護下面的代碼片段是我的資源管理器的一部分:安全

bool Load(std::string name, boost::shared_ptr<Asset::Model>& newModel) 
{ 
    std::map<std::string, boost::scoped_ptr<Asset::Model> >::const_iterator seeker; 

    seeker = models.find(name); 
    if (seeker == models.end()) 
    return false; 

    newModel = seeker->second->Copy(); // Copy returns a boost::shared_ptr<Asset::Model> 
    return true; 
} 

private: 
std::map< std::string, boost::scoped_ptr<Asset::Model> > models; 

因爲通過引用傳遞Boost的shared_ptr的其實不是的一部分shared_ptr概念,如果我只在這個範圍內使用它,我會遇到麻煩嗎?

回答

4

這種用法是安全的,因爲無論shared_ptr<>通過引用傳遞將有它的引用次數減少(假設從seeker->second->Copy()返回shared_ptr<>不是shared_ptr<>同一對象),因此目標將指向可能會被刪除。

具體來說,您不是從原始指針創建第二個shared_ptr<>(這是一個錯誤,因爲它會創建第二個不相關的shared_ptr<>帶有單獨的引用計數,因此是該對象的第二個所有者)。

你的功能是否提供你想要的行爲取決於你想要的。

1

我猜你想要做這樣的事情:

boost::shared_ptr<Asset::Model> ptr; 
if(Load("stuff", ptr)) 
{ 
    doSomething with ptr 
} 

在這種情況下,你應該罰款。

但是,您無需在此處使用參考。只返回一個shared_ptr,並將其設置爲0,如果沒有元素被發現:

boost::shared_ptr<Asset::Model> Load(std::string name) 
{ 
    std::map<std::string, boost::scoped_ptr<Asset::Model> >::const_iterator seeker; 
    boost::shared_ptr<Asset::Model> retPtr; 

    seeker = models.find(name); 
    if (seeker == models.end()) 
    return retPtr; 

    retPtr = seeker->second->Copy(); // Copy returns a boost::shared_ptr<Asset::Model> 
    return retPtr; 
} 

但是我注意到你在一個標準集裝箱使用scoped_ptr - 這AFAIK是不可能的。

+0

那麼我不想在加載失敗的情況下返回shared_ptr。這就是爲什麼我返回一個布爾 – cppanda 2011-01-22 17:12:16