Per un mio progetto, sto scrivendo da zero alcuni contenitori STL (ho le mie ragioni). Poiché sto simulando così da vicino le funzionalità e le interfacce della STL, sto facendo del mio meglio per mantenere la politica "se ha lo stesso nome di un costrutto standard, sarà conforme allo standard il più possibile".std :: constructor allocuct/destroy vs. placement new/p-> ~ T()
Quindi, ovviamente, i miei contenitori accettano gli allocatori come parametro di modello, il che è molto piacevole in quanto consente di utilizzare alcuni schemi di allocazione personalizzati. Alla mia domanda.
L'interfaccia std::allocator
separa l'allocazione della memoria dalla costruzione dell'oggetto. Allo stesso modo separa la deallocazione dalla distruzione. Questo ha senso dal momento che si ottiene la memoria da è più o meno irrilevante per costruire correttamente un oggetto in C++.
Quindi ci sono due funzioni costruzione/deallocazione che assomigliano a questo per l'implementazione predefinita (sollevato direttamente da un libro):
void construct(pointer p, const T& val) { new(p) T(val); }
void destroy(pointer p) { p->~T(); }
come si può vedere costruire chiama semplicemente nuova collocazione e distruggere chiama semplicemente il distruttore .
C'è qualche motivo per utilizzare questi semplicemente usando la sintassi del nuovo e del posizionamento? un allocatore "corretto" può implementarli in un altro modo? O sono garantito che tutte le implementazioni degli allocatori che sono conformi allo standard avranno dei metodi di costruzione/distruzione implementati in questo modo?
Più precisamente, è sicuro dire che posso sempre usare std::uninitialized_copy
e std::uninitialized_fill
per la costruzione degli elementi dei miei contenitori?
Grazie.
sì, questo è un buon punto, potrebbe essere un buon aggancio per la registrazione "post-allocazione/pre-costruzione" o il monitoraggio di memleak. –
Questa risposta è corretta ma un po 'fuorviante. Gli effetti collaterali come la registrazione sono in realtà abbastanza difficili da fare con la corretta sicurezza delle eccezioni. Più spesso la personalizzazione è regolando la nuova espressione incorporata, ad es. argomenti del costruttore Vedi https://groups.google.com/a/isocpp.org/d/topic/std-discussion/yZLnYy_y2z0/discussion – Potatoswatter