2010-02-24 2 views
8

Ich würde gerne wissen, wie man section 11.14 of the C++-FAQ-lite an Arrays anpassen.Wie deklarieren und verwenden Sie einen überladenen Pool-Operator löschen?

Grundsätzlich würde ich so etwas wie dies will:

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; 
} 

Aber ich habe nicht diesen operator delete[] (pool) erklärt die korrekte Syntax, um herauszufinden, und rufen kann. Kann mir hier jemand helfen?

Antwort

1

Es ist unmöglich. Bjarne ist der Ansicht, dass Sie nie den richtigen Pool finden werden. Seine Lösung ist: Sie müssen alle Destruktoren manuell aufrufen und dann den richtigen Pool herausfinden, um den Speicher manuell freizugeben.

Referenzen:

Bjarnes FAQ: Is there a placement delete?

Relevante C++ Standard Sektionen:

3.7.3.2.2 Nur Operator löschen Funktionen mit einem Argument von size_t Art werden zum Löschen Ausdrücke betrachtet.

5.3.5.1 Die Ausdruckssyntax löscht keine zusätzlichen Parameter.

2

Rufen Sie den dtors auf den einzelnen Objekten zuerst und dann verwenden:

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

Sie können den ganzen FAQ Artikel noch einmal lesen und Sie werden es dort finden.

+0

Sorry, ich verstehe es nicht. Wie löscht diese Anweisung das Array 'manyFoos'? Und woher weiß der Compiler, Operator 'delete []', nicht 'operator delete' zu ​​nennen? – Tobias

+0

@Tobias: Ich hatte einen Tippfehler. Feste Post – dirkgently

+0

@Tobias: Wenn Sie das Placement-Formular verwenden, müssen Sie tun, was der Compiler sonst automatisch für Sie tut - 1) rufen Sie das dtor auf dem Objekt (den Objekten) auf 2) geben Sie den Speicher frei. Die erste Codezeile kümmert sich um # 1. Jetzt sorgt die zweite Zeile dafür, dass der Teil des Pools, aus dem die Array-Objekte stammen, freigegeben wird. – dirkgently