Vuoi dire manualmente dover liberare memoria, chiudere file, cose di questo tipo? In tal caso, direi il minimo e in genere meno della maggior parte degli altri linguaggi che ho utilizzato, soprattutto se generalizziamo non solo la "gestione della memoria" ma anche la "gestione delle risorse". In questo senso, penso che il C ++ richieda una gestione delle risorse meno manuale rispetto a, ad esempio, 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 a livello di vlow (qualcosa che la maggior parte delle persone non ha bisogno di fare) o usando un'API C in cui passo solo un po 'di tempo avvolgere la risorsa C che deve essere manualmente liberata / distrutta / chiusa 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 contenga una gestione "memoria" o "risorsa" di un tipo che conta in questo contesto, dal momento che è praticamente necessario in qualsiasi lingua se si desidera liberare la memoria associata a quell'immagine in quel momento. Ma di nuovo tutto ciò che devi fare è rimuovere l'immagine dalla raccolta e il distruttore di immagini si prenderà cura di tutto il resto.
Nel frattempo, se mi confronto, ad esempio, in Java o in C #, spesso trovi persone che devono chiudere i file manualmente, disconnettere manualmente i socket, impostare i riferimenti agli oggetti su null per consentire loro di raccogliere i dati inutili, ecc. C'è molto altro memoria manuale e gestione delle risorse in quelle lingue se me lo chiedi. In C ++ spesso non hai nemmeno bisogno di unlock
di un mutex manualmente, dato che l'armadietto mutex lo farà automaticamente quando il mutex esce dallo scope. 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 c'è bisogno di fare cose come chiudere i file manualmente in C ++. Finiscono per chiudersi automaticamente nell'istante in cui escono dal campo di applicazione, indipendentemente dal fatto che escono dallo scopo o da percorsi di esecuzione normali o eccezionali. Cosa simile per risorse relative alla memoria come std::vector
. Tale codice come file.Close()
di cui sopra sarebbe spesso disapprovato da quando, soprattutto nel contesto di un blocco finally
, che suggerisce che la risorsa locale deve essere liberata manualmente quando l'intera mentalità attorno a C ++ è quella di automatizzarlo.
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 molti motivi per essere un po 'timidi nell'usare C ++ dato che è un linguaggio molto difficile da padroneggiare, ma la gestione della memoria non dovrebbe essere uno di questi. Al contrario, in realtà penso che sia una delle lingue più facili là fuori in questo aspetto.
Ovviamente C ++ ti permette di iniziare manualmente ad allocare memoria e invocare operator delete/delete[]
per liberare manualmente la memoria. Permette anche di usare funzioni C come malloc
e free
. Ma si tratta di pratiche di codifica in stile antico che credo siano diventate obsolete molto tempo prima che la gente desse credito, dal momento che Stroustrup stava sostenendo RAII prima ancora di coniare il termine fin dall'inizio. Quindi non penso nemmeno che sia giusto dire che il "moderno C ++" automatizza la gestione delle risorse, perché questo doveva essere lo scopo di sempre. Non puoi praticamente ottenere un'eccezione, altrimenti la sicurezza. È solo che molti sviluppatori fuorviati durante i primi anni '90 hanno provato ad usare il C ++ come C con gli oggetti, ignorando spesso completamente la gestione delle eccezioni, e non avrebbe mai dovuto essere usato in quel modo. Se usi C ++ come è stato praticamente sempre pensato per essere usato, la gestione della memoria è totalmente automatizzata e generalmente non è qualcosa che devi gestire manualmente (o che dovresti gestire) molto.