SORU
13 AĞUSTOS 2010, Cuma


Shared_ptr kullanmak için örnek?

Merhaba bu soruyu How to insert different types of objects in the same vector array ve benim kod hakkında bugün bir soru sordum

 gate* G[1000];
G[0] = new ANDgate() ;
G[1] = new ORgate;
//gate is a class inherited by ANDgate and ORgate classes
class gate
{
 .....
 ......
 virtual void Run()
   {   //A virtual function
   }
};
class ANDgate :public gate 
  {.....
   .......
   void Run()
   {
    //AND version of Run
   }  

};
 class ORgate :public gate 
  {.....
   .......
   void Run()
   {
    //OR version of Run
   }  

};      
//Running the simulator using overloading concept
 for(...;...;..)
 {
  G[i]->Run() ;  //will run perfectly the right Run for the right Gate type
 } 

ve birisi bunu ben yazdım vektörler kullanmak istedim :

std::vector<gate*> G;
G.push_back(new ANDgate); 
G.push_back(new ORgate);
for(unsigned i=0;i<G.size();  i)
{
  G[i]->Run();
}

ama sonra o ve diğerleri daha iyi Boost pointer containers
shared_ptr kullanırdım önerdi. Son 3 saat bu konu hakkında okuma geçirdim, ama bu belgeleri bana oldukça gelişmiş görünüyor .**Herkes shared_ptr kullanarak önerdiler bana neden shared_ptr kullanım küçük bir kod örneği ver. De var ptr_vector, ptr_list ptr_deque gibi diğer türleri**

Edit1: dahil de şu: bir kod örneği okudum

typedef boost::shared_ptr<Foo> FooPtr;
.......
int main()
{
  std::vector<FooPtr>         foo_vector;
........
FooPtr foo_ptr( new Foo( 2 ) );
  foo_vector.push_back( foo_ptr );
...........
}

Ve sözdizimi anlamıyorum!

CEVAP
13 AĞUSTOS 2010, Cuma


shared_ptr vector kullanarak kaldırır vektör yürümek ve her öğe üzerinde delete aramayı unuttum çünkü bellek sızıntı olasılığı. Örnek biraz değiştirilmiş bir versiyonu ile yürüyelim satır satır.

typedef boost::shared_ptr<gate> gate_ptr;

Paylaşılan bir imleç türü için bir takma ad oluşturun. Bu std::vector<boost::shared_ptr<gate> > yazma ve kapanış arasındaki boşluğu unutmadan kaynaklanan C dilinde çirkinlik önlerbüyüktür işaretleri.

    std::vector<gate_ptr> vec;

Oluşturur boost::shared_ptr<gate> nesneleri boş bir vektör.

    gate_ptr ptr(new ANDgate);

ANDgate yeni bir örneğini tahsis ve shared_ptr bir depola. Ayrı olarak bu iş için nedeni bir operasyon atar oluşabilecek bir sorunu önlemek için. Bu örnekte mümkün değil. Boost shared_ptr "Best Practices" bir neden açıklaren iyi uygulamageçici yerine kendi başına ayakta durabilen bir nesneye tahsis etmek.

    vec.push_back(ptr);

Bu vektör yeni paylaşılan bir işaretçi oluşturur ve içine ptr kopyalar. Başvuru shared_ptr bağırsaklar sayma ayrılan nesne ptr içinde güvenle vektör içine aktarılmasını sağlar.

Değil anlatılanlarla shared_ptr<gate> yıkıcı ayrılmış bellek silinir sağlar. Bu bellek sızıntısı önlenir. std::vector<T> yıkıcı T yıkıcı her öğe vektör kayıtlı olarak adlandırılan sağlar. Ancak, bir işaretçi için yıkıcı (,* örneğin *34)değil silmek ayrılmış olan bellek yok. Bunu engellemek için shared_ptr ptr_vector kullanarak çalışıyoruz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Epic Tutorials for iPhone, iPad and iOS

    Epic Tutoria

    18 EYLÜL 2011
  • FILIPeeeK

    FILIPeeeK

    22 Mayıs 2006
  • MndsgnVEVO

    MndsgnVEVO

    26 Kasım 2013