2017-04-23 22 views
0

有兩個容器:資源的所有者和非所有者。由於我只有1個擁有者,我想我需要unique_ptr。std :: unique_ptr的非所有者副本

class OwnershipContainer { 
public: 
    void add(std::unique_ptr<Obj> obj) { 
     objects.push_back(std::move(obj)); 
    } 
    Obj* get(std::size_t i) { return objects[i].get(); } 
private: 
    std::vector<std::unique_ptr<Obj>> objects; 
}; 

什麼樣的指針我必須用於非所有者容器?首先想到的是原始指針。但是我不能保證Obj的生命週期匹配或超過非所有者容器的壽命。

class NonOwnershipContainer { 
public: 
    void add(Obj *obj) { 
     objects.push_back(obj); 
    } 
    Obj* get(std::size_t i) { return objects[i]; } 
private: 
    std::vector<Obj*> objects; 
}; 

int main() { 
    NonOwnershipContainer nonOwnershipContainer; 
    { 
     OwnershipContainer ownershipContainer; 
     ownershipContainer.add(std::make_unique<Obj>(1)); 

     nonOwnershipContainer.add(ownershipContainer.get(0)); 
    } 
    auto pobj = nonOwnershipContainer.get(0); // dangling pointer 
} 

我可以用shared_ptr的所有者和weak_ptr的非所有者,所以如果weak_ptr的過期或沒有我可以檢查。但shared_ptr意味着我擁有共享所有權,在我的情況中不是這樣,我不需要引用計數器。

編輯:

我不想延長壽命。當所有者容器被銷燬時,我想避免懸掛指針。正如我上面寫的,我可以使用shared_ptr + weak_ptr。

class OwnershipContainer { 
public: 
    void add(std::shared_ptr<Obj> obj) { 
     objects.push_back(obj); 
    } 
    std::shared_ptr<Obj> get(std::size_t i) { return objects[i]; } 
private: 
    std::vector<std::shared_ptr<Obj>> objects; 
}; 


class NonOwnershipContainer { 
public: 
    void add(std::shared_ptr<Obj> obj) { 
     objects.push_back(obj); 
    } 
    std::shared_ptr<Obj> get(std::size_t i) { return objects[i].lock(); } 
private: 
    std::vector<std::weak_ptr<Obj>> objects; 
}; 

int main() { 
    NonOwnershipContainer nonOwnershipContainer; 
    { 
     OwnershipContainer ownershipContainer; 
     ownershipContainer.add(std::make_shared<Obj>(1)); 

     nonOwnershipContainer.add(ownershipContainer.get(0)); 
    } 
    auto pobj = nonOwnershipContainer.get(0); // no more dangling pointer, pobj == nullptr 
} 

但在這種情況下,我要爲參考計數器,它在哲學上是錯誤的:只有一個所有者使用的shared_ptr。

+0

對普通的'std :: vector '有什麼爭議?你在做什麼主要看起來很危險。本質上你試圖延長生命,這意味着你的所有權是錯誤的。 – stefan

+0

我使用繼承和多態,Obj是一個基類。 –

+1

如果擁有的容器應該是唯一的擁有者,那麼對這些對象的所有訪問都必須經過它。 – StoryTeller

回答

2

你居然有共同的所有權:當你通過NonOwningContainer -contained指針性的東西訪問對象,你必須採取所有權,或者當你使用它的對象可以從你下了消失。

因爲你不能保證該對象將不會從你下了消失:

但我不能給保證obj是否匹配的使用壽命或超過非業主容器的壽命。

那麼你唯一的選擇就是分享所有權。因此shared_ptrweak_ptr是合適的方法。

此外,根據OwnershipContainerNonOwnershipContainer的使用壽命的不同,請注意the interaction between std::make_shared and std::weak_ptr