2009-12-08 13 views
5

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

4

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). 
+0

Impossibile trovare tale istruzione in C++ Standard. Quale revisione usi? –

+0

ISO/IEC 14882: 1998 (E) –

+1

È 20.4.1.1, non 24.4.1.1, che potrebbe spiegare perché Kirill non l'ha trovato. –

2

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.

+2

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

2

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.

0

Se si desidera impedire la creazione del proprio oggetto, fare il costruttore privato anziché operator new.

0

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.

Problemi correlati