2014-12-09 30 views
5

Normal koşullarda bellek ayırma işleminin nasıl yapıldığını biliyorum. Benim durumum biraz farklı.operatörü sil - nasıl uygulanır?

Kendi bellek havuzumu uyguluyorum. Sınıfımın müşterisinin, genel tahsis ve tahsisat yöntemine yakın olmasını istiyorum.

inline void* operator new(size_t dead_param, CPool& objPool) 
{ 
    return objPool.Allocate(); 
} 

benim sınıfının kullanıcı basitçe

Base baseObj = new (poolObj)Base2();

çağırabilir yüzden, bu küresel işleve sahip

Şimdi yıkıcı çağırmak nasıl bilmiyorum? Küresel operatör

inline void operator delete(void* ptr, CPool& objPool) 
{ 
    objPool.DeAllocate(ptr); 
} 

kılavuz lütfen silme olsa ben istemci kodundan denilen bu işlevi nasıl alabilirim ben .. no fikir

sahip clearl? Kullanıcı tarafındaki sözdiziminde minimum değişiklik. Ayrıca, benim kodlarımın operator new ve operator delete'u uygulamak istemediğini ve oradan Allocate ve DeAllocate numaralı telefonu arayacağımı unutmayın.

+0

Neden insanlar 'Baz * baseObj = poolObj.Allocate() çağrısı sadece var; müşteri için' – Barry

+0

Dizimi biraz çirkin görünüyor. Base * baseObj = (Base *) poolObj.Allocate() '. Yuck .. typecasting ... ben son çare olarak tutmuş olsam da .. Bu fonksiyona gelemediğimden beri, şimdi güvendeyim .. – Adorn

+5

Yerleşim silme, bir kurucu ile çıktığı zaman, sadece iç yerleşimden yeni çağrılır bir istisna. Diğer tüm durumlarda, bir "normal" işleç silme (void *) 'denir. Daha sonra ek bir girdi olmadan, daha sonra ayrılabilmek için ayrılmış bellek bloğuna yeterli bilgiyi saklamanız gerekir. Genellikle, ayırıcı, döndürdüğü gösterici tarafından negatif ofsette ek bilgi yazardı. –

cevap

1

lafın kısası: Yeni Yerleşim ile açıkça çağıran yıkıcı OK tek durumdur:

baseObj-> ~ Baz();

Ama bu bellek gibi görünüyor, çünkü bellek havuzunuzda, aslında son kullanıcının tüm kitap tutmayı yapmasını sağlıyorsunuz ... bu, bellek havuzu sınıfınızı daha iyi (ve muhtemelen biraz daha kötü) sadece bir std :: vector. Ben kullanıcıyı olmazdı

yerleştirme Kendi bellek havuzu besleyen eğer kendileri ... daha doğrusu, bu ObjectPool sınıfını Withing yapılmalı yeni yapın: Dürüst

class ObjectPool { 
    public: 
    template <typename T, typename... A>/*c++ 11 ftw*/ 
    T* allocate(A... args) { 
     void* create_location;//pool figures out where this is, probably with sizeof<T> 

     return new (create_location) T(args...); 
    } 
    template <typename T> 
    void dellocate(T* t) { 
     t.~T();//With placement new, this is the one place this is OK 
     //pool marks that memory as avaiable to be allocated in 
    } 
} 

, bu tek yoldur Havuzunuz için daha fazla yardımcı programa sahip olmanız ve son kullanıcının sadece kendi std::vector<uint8_t>.

yığın başka bir şey ayırmalarına T tutmak için hiçbir şey yapmaz unutulmamalıdır ...

+0

tamam .. Muhtemelen tasarım konusunda bana biraz daha aydınlatabilirsiniz http://stackoverflow.com/questions/27375620/generic-memory-pool-how-to-design-issue Tamamen söylediğiniz şeyi alıyorum. – Adorn