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.
- 1. Contenitori STL, conflitti SBO e allocatori personalizzati
- 2. Allocatori conformi a STL C++
- 3. Differenza tra "nuovo operatore" e "operatore nuovo"?
- 4. operatore nuovo sovraccarico e allineamento
- 5. Allocatori personalizzati STL per gestire diversi spazi di memoria
- 6. Abbiamo ancora bisogno di "posizionamento nuovo" e "operatore nuovo"?
- 7. Errore STL in meno e errore "operatore non valido <
- 8. Prestazioni degli allocatori personalizzati
- 9. Alcuni allocatori sono pigri?
- 10. Qual è lo scopo di avere un "operatore nuovo [] nuovo"?
- 11. C++ UNICODE e STL
- 12. Qual è la differenza tra il nuovo operatore e Class.newInstance()?
- 13. È necessario sovraccaricare il posizionamento di un nuovo operatore, quando sovraccarichiamo un nuovo operatore?
- 14. C++: allocatori di memoria
- 15. nuovo operatore per allocazione memoria su heap
- 16. Riferimento non definito al nuovo operatore
- 17. Nuovo operatore C++ - layout di memoria
- 18. oggetti istanziare senza utilizzare nuovo operatore
- 19. RAII e C++ STL
- 20. const e STL contenitori
- 21. Quali sono gli allocatori e quando è necessario il loro uso?
- 22. Gli allocatori personalizzati in AWL allocano solo i dati effettivi?
- 23. Perché i funtori STL sono a loro volta modelli e non la loro funzione chiama operatore?
- 24. Utilizzo di più allocatori in modo efficiente
- 25. OpenMP e STL-style per
- 26. Contenitori OpenCV, Matlab e STL
- 27. set STL incrocio e l'uscita
- 28. STL vettore: ridimensionare() e assegnare()
- 29. Funzioni refL e creff STL
- 30. Il vettore STL usa 'nuovo' e 'cancella' per l'allocazione di memoria di default?
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. –