A mio parere, è più complicato usarlo invece di usare new e delete.
Sì, ma non è destinato a sostituire new
e delete
, ha uno scopo diverso.
Con allocatore è necessario allocare esplicitamente memoria heap, costruirla, distruggerla e infine rilasciare la memoria.
Quindi perché è stato creato?
Perché a volte si desidera separare l'allocazione e la costruzione in due passaggi (e allo stesso modo separare distruzione e deallocazione in due passaggi). Se non si desidera farlo, non utilizzare un allocatore, utilizzare invece new
.
In quali casi può essere utilizzato e quando deve essere utilizzato al posto di nuovo ed eliminare?
Quando è necessario il comportamento di un allocatore, non il comportamento di new
e delete
, ovviamente! Il caso tipico è quando si implementa un contenitore.
consideri il codice seguente:
std::vector<X> v;
v.reserve(4); // (1)
v.push_back(X{}); // (2)
v.push_back(X{}); // (3)
v.clear(); // (4)
Qui linea (1) deve allocare memoria sufficiente per quattro oggetti, ma non costruirli ancora.Quindi le righe (2) e (3) devono costruire oggetti nella memoria allocata. Quindi la linea (4) deve distruggere quegli oggetti, ma non rilasciare la memoria. Infine, nel distruttore del vettore, tutta la memoria può essere deallocata.
Quindi il vettore non può utilizzare solo new X()
o delete &m_data[1]
per creare e distruggere gli oggetti, deve eseguire allocazione/deallocazione separatamente dalla costruzione/distruzione. L'argomento del modello di allocatore di un contenitore definisce la politica da utilizzare per (de) allocare memoria e costruire/distruggere oggetti, consentendo di personalizzare l'utilizzo della memoria del contenitore. La politica predefinita è il tipo std::allocator
.
Quindi si utilizza un allocatore quando è richiesto un allocatore (ad esempio quando si utilizza un contenitore) e si utilizza std::allocator
quando non si desidera fornire un allocatore personalizzato e si desidera solo quello standard.
Non si utilizza un allocatore in sostituzione di new
e delete
.
In C è stata allocata e deallocata memoria. In C++ usi 'new' e' delete' che sono molto più puliti di quello che fai in C. Se stai usando C++, usa 'new' e' delete'. –
La domanda non riguarda 'malloc' ma' std :: allocator'. –
@EvanCarslake E come sono 'new' e' delete' non allocare/deallocare la memoria? La vera differenza è completamente indipendente: Esecuzione di costruttori/distruttori. – deviantfan