SORU
6 Mayıs 2011, Cuma


Neden std::shared_ptr<boşluk> iş

Bazı kodlar buldum std::shared_ptr kapatma. rastgele temizleme gerçekleştirmek için İlk başta bu kod belki işe yarayabilir. ben de düşündüm, ama sonra takip etmeye çalıştım:

#include <memory>
#include <iostream>
#include <vector>

class test {
public:
  test() {
    std::cout << "Test created" << std::endl;
  }
  ~test() {
    std::cout << "Test destroyed" << std::endl;
  }
};

int main() {
  std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr<void>>" 
            << std::endl;
  std::vector<std::shared_ptr<void>> v;
  {
    std::cout << "Creating test" << std::endl;
    v.push_back( std::shared_ptr<test>( new test() ) );
    std::cout << "Leaving scope" << std::endl;
  }
  std::cout << "Leaving main" << std::endl;
  return 0;
}

Bu program çıktıyı verir:

At begin of main.
creating std::vector<std::shared_ptr<void>>
Creating test
Test created
Leaving scope
Leaving main
Test destroyed

Bu işe yarayabilir neden bazı fikirlerim var, std iç ile ne ilgisi var::shared_ptrs G için uygulanan gibi . Bu nesneler, iç işaretçi sayacı ile birlikte sarın beri std::shared_ptr<void> std::shared_ptr<test> dökme muhtemelen yıkıcı çağrısı engel değildir. Bu varsayım doğru mu?

Ve tabii ki çok daha önemli soru şu: bu standart ile çalışmak için garantili veya std iç değişiklik daha olabilir::shared_ptr, diğer uygulamalar aslında bu kod sonu?

CEVAP
6 Mayıs 2011, Cuma


Hile std::shared_ptr tip silme gerçekleştirir. Temel olarak, ne zaman yeni bir shared_ptr yaratılmış olacaktır deposu dahili deleter fonksiyon (hangi nedeniyle argüman olarak yapıcı ama eğer yoksa varsayılan arama delete). shared_ptr özelleştirmeler, saklı işlevini çağırır ve o deleter arayacak.

Std ile basitleştirilmiş oluyor yazın silme basit bir kroki::fonksiyon ve referans sayma ve diğer sorunları görmezden burada görülebilir:

template <typename T>
void delete_deleter( void * p ) {
   delete static_cast<T*>(p);
}

template <typename T>
class my_unique_ptr {
  std::function< void (void*) > deleter;
  T * p;
  template <typename U>
  my_unique_ptr( U * p, std::function< void(void*) > deleter = &delete_deleter<U> ) 
     : p(p), deleter(deleter) 
  {}
  ~my_unique_ptr() {
     deleter( p );   
  }
};

int main() {
   my_unique_ptr<void> p( new double ); // deleter == &delete_deleter<double>
}
// ~my_unique_ptr calls delete_deleter<double>(p)

Ne zaman bir shared_ptr kopyalanan (veya varsayılan inşa) diğerine deleter geçirilen etrafında, böylece ne zaman bir yapı shared_ptr<T> shared_ptr<U> bilgiyi hangi yıkıcı arayıp da çevresinde bulunan deleter.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobinire

    bobinire

    24 EYLÜL 2006
  • dcigs

    dcigs

    9 EYLÜL 2006
  • TheRightTire

    TheRightTire

    14 EKİM 2009