2010-02-24 15 views
8

section 11.14 of the C++-FAQ-lite dizilerine nasıl uyarlanacağını bilmek istiyorum.Aşırı yüklenmiş havuz operatörü silme işlemini nasıl bildiriyorsunuz?

class Pool { 
public: 
    void* allocate(size_t size) {...} 
    void deallocate(void* p, size_t size) {...} 
}; 

void* operator new[](size_t size, Pool& pool) { return pool.allocate(size); } 
void operator delete[](void* p, size_t size, Pool& pool) { pool.deallocate(p, size); } 

struct Foo {...}; 

int main() { 
    Pool pool; 

    Foo* manyFoos = new (pool) Foo [15]; 

    /* ... */ 

    delete [] (pool) manyFoos; 
} 

Ancak, beyan ve bu operator delete[] (pool) çağırmak için doğru sözdizimi anlamaya edemedik:

Temelde, böyle bir şey istemez. Buraya kimse yardım edebilir mi?

cevap

1

Bu imkansız. Bjarne nedenleri doğru havuzu bulmaktan asla alamayacaksınız. Onun çözümü: Tüm yıkıcıları el ile çağırmalı ve ardından belleği el ile ayırmak için doğru havuzu bulmalısınız.

Referanslar:

Bjarne SSS: Is there a placement delete?

İlgili C++ standart bölümler:

3.7.3.2.2 Sadece üye operatörü size_t türünde bir argüman ile fonksiyonlarını silmek için sil ifadeler için kabul edilir.

5.3.5.1 İfade sözdizimini silme, fazladan parametrelere izin vermez.

2

Çağrı birinci ve sonra tek nesneler üzerinde dtors kullanın:

for (int i = 0; i < 15; ++i) manyFoos[ i ]->~Foo(); 
operator delete[] (manyFoos, pool); 

Yine bütün SSS öğeyi okuyabilir ve orada bulabilirsiniz.

+0

Üzgünüm, anlamadım. Bu ifade 'manyFoos 'dizisini nasıl siliyor? Ve derleyici 'operatör silme 'değil, operatör silme []' yi nasıl çağırır? – Tobias

+0

@Tobias: Yazım hatası yaşadım. Sabit gönderi. – dirkgently

+0

@Tobias: Yerleşim formunu kullanırken, derleyicinin sizin için otomatik olarak ne yaptığını yapmanız gerekir - 1) nesne (ler) üzerindeki dtoru çağırmak 2) belleği boşaltın. İlk kod satırı # 1 ile ilgilenir. Şimdi, ikinci satır, dizi nesnelerinizin geldiği 'havuz' bölümünün serbest bırakılmasıyla ilgilenir. – dirkgently

İlgili konular