2012-07-02 22 views
12

Bu sınıf UniqueElement başka yerde tanımlanan bir POD sınıftırGarip davranışlar 2010

#include <memory> 

class ContainerUnique 
{ 
public: 

    ContainerUnique(void); 
    ~ContainerUnique(void); 

private: 
    std::unique_ptr<UniqueElement> u; 
}; 

yazmaya çalıştı. Şimdi böyle yapıcı vücudu tanımlayın:

ContainerUnique::ContainerUnique(void) 
{ 
    auto tmp = new UniqueElement(1); 

    this->u(tmp); // u is a unique_ptr<UniqueElement>. Should this call compile? 
} 

Ve istisnasız uyumludur. Programı çalıştırıyorum, ContainerUnique yapıcısı çağrıldıktan sonra, u bir boş gösterici içeriyor.

Bu amaçlanan davranış mı? Ve hangi unique_ptr yöntemini arıyorum?

+3

Karşılaştığınız sorunlardan emin değilsiniz. Ancak, üye değişkenini u, kurucunun initialaztrion listesinde başlatarak önleyin. –

+0

Evet, bu benim gerçek kodumda kullandığım çözümdür, ancak örnekte olup bitenlerden hala emin değilim. –

+0

Otomatik değişkeninizin türünü yazdırmayı deneyin. Typeid'in çalışıp çalışmadığından emin değil. Türünü öğrendikten sonra geri kalan kısım kolay olmalıdır. –

cevap

19

This is a known problem with VS2010's unique_ptr. gibi yapılmalıdır Bu onun deleter kamuya devralır bir optimizasyon (boş baz optimizasyonu) olarak boşsa. Kamu mirasının olumsuz tarafı, delicinin tüm üyelerinin de unique_ptr'un mevcut üyeleri haline gelmesidir, bu durumda işaretleyiciyi silen operator()(T*).

Bu hata, mirasın özel olarak değiştirildiği VS2012'nin kitaplığında sabitlenmiştir.

+1

ah, beni ona dövdün. Iyi bulmak. – stijn

2

O

ContainerUnique::ContainerUnique(void):u(new UniqueElement(1)) { 
} 
+1

Bu, üretim kodumdaki sorunu çözdüğüm yoldur, ancak örnekte neler olduğu konusunda hala emin değilim. –

8

default_delete<UniqueElement>::operator() (UniqueElement* ptr) numaralı telefonu arıyorsunuz, çünkü uniqe_ptr ondan türemiştir (boş temel sınıf optimizasyonundan yararlanmak için) ve ptr'u siler. Bu, sizin için tam olarak amaçlanmış bir davranış değildir, ancak standartın yasak olduğunu düşünmüyorum.

İlgili konular