SORU
16 Mayıs 2011, PAZARTESİ


Std::unique_ptr<T> T tam tanımını bilmek gerekir?

Şuna benzer bir başlık içinde bazı kod var:

#include <memory>

class Thing;

class MyClass
{
    std::unique_ptr< Thing > my_thing;
};

Eğer Thing tip tanımı içermeyen bir cpp olarak bu başlığı ben dahil ederseniz, o zaman bu VS2010 SP1 altında derleme değil:

1>C:\Program Dosyaları (x 86) Microsoft\ Visual Studio 10.0\VC\\hafıza vardır(2067): hata C2027: tanımsız tür kullanın'' . Şey

std::shared_ptr std::unique_ptr değiştirin ve derler.

Yani VS2010 std::unique_ptrgeçerli'tam tanımını ve gerekli s uygulama tamamen uygulama bağımlı. olduğunu tahmin ediyorum

Yoksa değil mi? std::unique_ptr'In sadece ileri bir bildiri ile çalışmak için uygulama için mi? imkansız kılan bu standart gereksinimleri bir şey var Garip geliyor sadece Thing, bir işaretçi tutmak gerekir değil mi?

CEVAP
22 Mayıs 2011, Pazar


here kabul etti.

C standart kitaplığındaki en şablonları onlar tam türleri ile oluşturulmuş olması gerekir. Ancak shared_ptr unique_ptrkısmiözel durumlar. Bazı üyelerinin değil, tüm tamamlanmamış türleri ile oluşturulmuş olabilir. Bunun için motivasyon pimpl gibi cümleler akıllı işaretçiler ve tanımsız davranış riske atmadan kullanarak destek olmaktır.

Tanımsız davranış tamamlanmamış bir tür oluşabilir ve delete Ara:

class A;
A* a = ...;
delete a;

Yukarıdaki yasal kod. Derleme olacak. Derleyici olabilir ya da yukarıdaki gibi yukarıdaki kod için bir uyarı olabilir. Çalıştırıldığında, kötü şeyler muhtemelen olmayacak. Eğer çok şanslıysan programın kilitlenmesine. Ancak daha muhtemel bir sonuç programınızı sessizce ~A() denilen olmayacak gibi bellek sızıntısı olur.

Yukarıdaki örnekte auto_ptr<A> kullanarak yardımcı olmuyor. Eğer ham bir işaretçi kullanmış olsaydınız olarak hala aynı tanımsız davranış.

Yine de, bazı yerlerde eksik sınıfları kullanarak çok yararlı! Bu shared_ptr unique_ptr yardım. Bu akıllı işaretçileri birini kullanarak uzak tam bir tür olması gerekli olduğu dışında eksik bir türü ile, izin verir. Ve en önemlisi, tam bir tür olması gerektiğinde, eğer bu noktada eksik bir türü ile akıllı işaretçi kullanmayı denerseniz derleme zamanı hatası alırsınız.

Daha tanımsız hiçbir davranış:

Eğer kodunuzu derler, sonra her yerini tam bir tip kullandım.

class A
{
    class impl;
    std::unique_ptr<impl> ptr_;  // ok!

public:
    A();
    ~A();
    // ...
};

shared_ptr unique_ptr farklı yerlerde tam bir türü gerektirir. Nedenleri belirsiz, dinamik deleter vs ile statik bir deleter yapmak zorunda. Kesin nedenleri önemli değil. Aslında çoğu size tam olarak eksiksiz bir türü gerekli olduğunu bilmek için çok önemli değil kod. Sadece kod ve eğer yanlış cevap verirseniz, derleyici size söyleyecektir.

Sizin için yararlı olduğunu, ancak bu durumda, burada bütünlüğü gerekliliklere shared_ptr unique_ptr bazı üyeleri belgeleri olan bir tablodur. Eğer üyenin tam bir türü gerektiriyorsa, o zaman bir giriş vardır "C", aksi takdirde tablo girişi ile dolu "ben".

Complete type requirements for unique_ptr and shared_ptr

                            unique_ptr       shared_ptr
 ------------------------ --------------- --------------- 
|          P()           |      I        |      I        |
|  default constructor   |               |               |
 ------------------------ --------------- --------------- 
|      P(const P&)       |     N/A       |      I        |
|    copy constructor    |               |               |
 ------------------------ --------------- --------------- 
|         P(P&&)         |      I        |      I        |
|    move constructor    |               |               |
 ------------------------ --------------- --------------- 
|         ~P()           |      C        |      I        |
|       destructor       |               |               |
 ------------------------ --------------- --------------- 
|         P(A*)          |      I        |      C        |
 ------------------------ --------------- --------------- 
|  operator=(const P&)   |     N/A       |      I        |
|    copy assignment     |               |               |
 ------------------------ --------------- --------------- 
|    operator=(P&&)      |      C        |      I        |
|    move assignment     |               |               |
 ------------------------ --------------- --------------- 
|        reset()         |      C        |      I        |
 ------------------------ --------------- --------------- 
|       reset(A*)        |      C        |      C        |
 ------------------------ --------------- --------------- 

Herhangi bir operasyon işaretçi dönüşüm gerektiren unique_ptr shared_ptr Her ikisi için de tam bir tür gerektirir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006