Esistono implementazioni STL che utilizzano operator new[]
come allocatore? Sul mio compilatore, rendere privato Foo::operator new[]
non mi ha impedito di creare un vector<Foo>
... è un comportamento garantito da qualcosa?Allocatori e operatore STL nuovo []
risposta
Standard C++, sezione 20.4.1.1. L'allocatore predefinito alloca() utilizza operatore globale nuovo:
pointer allocate(size_type n, allocator<void>::const_pointerhint=0);
3 Notes: Uses ::operator new(size_t) (18.4.1).
std biblioteca implementazioni non utilizzeranno T :: operator new [] per std :: allocator. La maggior parte di loro utilizza la propria infrastruttura di condivisione della memoria dietro le quinte.
In generale, se si desidera interrompere l'allocazione dinamica degli oggetti Foo
, è necessario rendere privati tutti i costruttori e fornire una funzione che crei gli oggetti . Naturalmente, non sarai in grado di crearli come variabili auto
.
Un vettore sostanzialmente assegna la memoria non inizializzata e colloca gli oggetti in seguito quando vengono aggiunti. La prenotazione della memoria non crea istanze. – UncleBens
std :: vector utilizza un Allocatore passato come argomento modello, che per impostazione predefinita è std :: allocate. Tuttavia, l'allocatore non funziona come new[]
: assegna solo la memoria non elaborata e il posizionamento new
viene utilizzato per creare effettivamente gli oggetti in quella memoria quando gli viene richiesto di aggiungere gli oggetti (ad esempio con push_back()
o resize()
).
L'unico modo in cui è possibile utilizzare new[]
in un allocatore sarebbe se si abusassero un po 'di cose e si assegnasse spazio grezzo usando qualcosa come new char[size];
. Come gli abusi, quello è abbastanza innocuo, ma non è ancora correlato al sovraccarico di new[]
per la classe.
Se si desidera impedire la creazione del proprio oggetto, fare il costruttore privato anziché operator new
.
Oltre alle altre risposte qui, se si desidera impedire a chiunque di creare un contenitore STL per il proprio tipo , è sufficiente creare il costruttore di copia per Foo
privato (anche il costruttore di movimento se si sta lavorando con C++ 11). Tutti gli oggetti del contenitore STL devono disporre di un costruttore di copia o spostamento valido per l'allocatore del contenitore per chiamare correttamente il posizionamento new
e costruire una copia dell'oggetto nel blocco di memoria assegnato per il contenitore.
Impossibile trovare tale istruzione in C++ Standard. Quale revisione usi? –
ISO/IEC 14882: 1998 (E) –
È 20.4.1.1, non 24.4.1.1, che potrebbe spiegare perché Kirill non l'ha trovato. –