Intendi come dover liberare manualmente memoria, chiudere file, cose di questo tipo? In tal caso, direi il minimo e in genere meno della maggior parte delle altre lingue che ho usato, soprattutto se generalizziamo questo non solo per "gestione della memoria" ma "gestione delle risorse". In tal senso, in realtà penso che C ++ richieda una gestione manuale delle risorse inferiore rispetto a, diciamo Java o C #.
È principalmente dovuto ai distruttori che automatizzano la distruzione della risorsa (memoria o altro). In genere l'unica volta che devo liberare / distruggere una risorsa manualmente in C ++ è se sto implementando una struttura di dati di livello inferiore (cosa che la maggior parte delle persone non ha bisogno di fare) o usando un'API C dove passo solo un po 'di tempo wrapping della risorsa C che deve essere liberata / distrutta / chiusa manualmente in un wrapper C ++ conforme a RAII.
Naturalmente se un utente richiede di chiudere un'immagine in un software di modifica delle immagini, devo rimuovere l'immagine da una raccolta o qualcosa del genere. Ma si spera che ciò non valga come "memoria" o gestione delle "risorse" di un tipo che conta in questo contesto, dal momento che è praticamente richiesto in qualsiasi lingua se si desidera liberare la memoria associata a quell'immagine in quel momento. Ma tutto ciò che devi fare è rimuovere l'immagine dalla raccolta e il distruttore di immagini si occupa di tutto il resto.
Nel frattempo, se paragone, per esempio, a Java o C #, spesso trovi persone che devono chiudere manualmente i file lì, disconnettere manualmente i socket, impostare i riferimenti agli oggetti su null per consentire loro di essere immondizia, ecc. C'è molta più memoria manuale e gestione delle risorse in quelle lingue se me lo chiedi. In C ++ spesso non hai nemmeno bisogno di unlock
un mutex manualmente, poiché l'armadietto mutex lo farà automaticamente quando il mutex esce dall'ambito. Ad esempio, non dovresti mai fare cose del genere in C ++:
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
Non è necessario eseguire operazioni come la chiusura manuale dei file in C ++. Finiscono per chiudersi automaticamente nell'istante in cui escono dal campo di applicazione, di conseguenza, o se seguono percorsi di esecuzione normali o eccezionali. Cosa simile per risorse legate alla memoria come std::vector
. Tale codice come file.Close()
sopra sarebbe spesso disapprovato poiché, specialmente nel contesto di un finally
blocco, suggerisce che la risorsa locale deve essere liberata manualmente quando l'intera mentalità attorno a C ++ è quella di automatizzarla.
In termini di gestione manuale della memoria, direi che C richiede il massimo, Java / C # una quantità media e C ++ il minimo tra questi. Ci sono molte ragioni per essere un po 'timidi nell'uso del C ++ poiché è un linguaggio molto difficile da padroneggiare, ma la gestione della memoria non dovrebbe essere una di queste. Al contrario, in realtà penso che sia una delle lingue più semplici là fuori in questo aspetto.
Naturalmente C ++ ti consente di iniziare a allocare manualmente la memoria e invocare la operator delete/delete[]
memoria libera manualmente. Ti permette anche di usare funzioni C come malloc
efree
. Ma si tratta di pratiche di codifica di tipo antico che credo siano diventate obsolete molto prima che le persone attribuissero credito, dal momento che Stroustrup sosteneva la RAII prima ancora che coniasse il termine fin dall'inizio. Quindi non penso nemmeno che sia giusto dire che il "moderno C ++" automatizza la gestione delle risorse, perché quello doveva essere lo scopo da sempre. Altrimenti non è praticamente possibile ottenere la sicurezza delle eccezioni. È solo che molti sviluppatori mal guidati all'inizio degli anni '90 hanno provato a usare C ++ come C con oggetti, spesso ignorando completamente la gestione delle eccezioni e non avrebbe mai dovuto essere usato in quel modo. Se usi C ++ nel modo in cui era praticamente sempre inteso che fosse usato, allora la gestione della memoria è totalmente automatizzata e in genere non è qualcosa che devi affrontare (o che dovresti trattare) molto manualmente.