2013-04-17 27 views
37

Sahip olunan bir nesnenin ömrünün sahibine bağlı olduğu ortak durum göz önünde bulundurulduğunda, benzersiz bir işaretçiyi 2 yoldan birini kullanabilirim. .Bir unique_ptr atamalı mıyım yoksa sıfırlamalı mıyım?

Bu atanabilir :

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned=std::unique_ptr<someObject>(new someObject());   
    } 
}; 

sıfırlama yöntemi kullanılabilir: En iyi uygulama çıkarları

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned.reset(new someObject()); 
    } 
}; 

, başka üzerinden bir formu tercih etmeliyiz?

EDIT: Üzgünüm millet. Bunu basitleştirdim. Yığın tahsisi, bir başlangıç ​​yönteminde ve ctorda değil. Bu nedenle, başlatıcı listelerini kullanamıyorum. Bunun dışında ben reset tercih ediyorum bundan

owner() : owned(new someObject()) 
{} 

bir işe yaramaz ara oluşturmayın olarak:

cevap

27

: nesnenin

Transferler mülkiyeti r tarafından işaret etmek * Bu std::forward<E>(r.get_deleter()) bir atama tarafından takip reset(r.release()) arayarak sanki.

Ve sen bunların gereken tüm reset çağrıdır, böylece "Bir işe yaramaz ara örneğini oluşturmaz gibi reset tercih ediyorum" doğrudan

+26

Geç olduğunu biliyorum, ancak gelecekteki okuyucular için. Scott Meyers'e göre Effective Modern C++ adlı kitabında, istisna güvenliği sağladığı için std :: make_unique tercih edilir: owner = std :: make_unique (). Sorun şu ki, std :: make_unique , C++ 14'ün (C++ 11 değil) bir parçasıdır, ancak burada [burada] bulabilirsiniz (https://isocpp.org/files/papers/N3656.txt) a kopyalayıp yapıştırabileceğiniz iyi bir uygulama. –

15

(liste vermedi o) Bunu yapmanın en uygun yolu owned ait yapıcısı Bu durumda (en iyi duruma getirici olarak çok fazla şey yapabildiği için makine seviyesinde bir fark olmayabilir). the docs of unique_ptr's operator= itibaren

+1

ara artık daha basit - onu alır. Teşekkürler – learnvst

İlgili konular