Wie erklären Sie und verwenden ein überlasteter Poolbetreiber löschen?
-
22-09-2019 - |
Frage
würde Ich mag wissen, wie anzupassen Abschnitt 11.14 von die C ++ -. FAQ-lite Arrays
Im Grunde 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;
}
Allerdings habe ich die richtige Syntax nicht in der Lage gewesen, um herauszufinden, diese operator delete[] (pool)
zu erklären anzurufen. Kann jemand helfen hier?
Lösung 2
Es ist unmöglich. Bjarne Gründe dafür, dass Sie nie es richtig den richtigen Pool herauszufinden. Seine Lösung ist. Sie müssen manuell alle Destruktoren aufrufen und dann herauszufinden, den richtigen Pool Lage sein, den Speicher manuell freigeben
Referenzen:
Bjarnes FAQ: Gibt es eine Platzierung löschen
Relevante C ++ Standard Sektionen:
3.7.3.2.2 Nur Operator Löschfunktionen mit einem Argument von size_t Art werden zum Löschen Ausdrücke betrachtet.
5.3.5.1 Löschen Ausdruck Syntax erlaubt keine zusätzlichen Parameter.
Andere Tipps
Rufen Sie die dtors auf die einzelnen Objekte 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.