Uno dei punti più critici della programmazione in C++ è la gestione della memoria dinamica. In questi frangenti il C++ non gode di una buona reputazione: troppi programmi saltano inspiegabilmente, o ingurgitano memoria in modo anomalo e pericoloso per il sistema.
La colpa è di quegli sviluppatori che affrontano la gestione manuale della memoria dinamica in modo troppo "ottimista" e ingenuo.
In questa serie di quattro puntate si affronta il problema fornendo diverse analisi e soluzioni, mostrando quali strumenti è possibile utilizzare per gestire automaticamente la memoria dinamica, o analizzarne il comportamento.
| 112 | Marzo 2007 | Un Garbage Collector per C++ |
|
Un modo semplice ed efficace per gestire la memoria dinamica, è quello di affidarla alle cure di un Garbage Collector. Ma cos'è e come funziona un GC? Perché il C++ standard non ne prevede l'implementazione? In questo articolo si risponderà a queste domande e si mostrerà il Garbage Collector Boehm-Demers-Weiser: dalla sua installazione agli usi più comuni. |
||
| Errata Corrige: | ||
|
Nella figura 1 ho scambiato di posto pGlobale con pLocale... Eh? Cosa? Come sarebbe: "non siamo scemi c'eravamo già arrivati da soli ché c'è scritto nel codice e pure nel testo non c'era bisogno che arrivassi tu a farcelo notare"? Vai a fare del bene... (e mettete la punteggiatura, quando parlate!) |
||
| Note: | ||
|
Sulla rivista la bibliografia è morta di un male inspiegabile. Eccola, a perenne memoria: Il mondo (e anche il web) è pieno di informazioni sulla garbage collection. Sfortunatamente sono molto frammentate e di qualità variabile. Si spazia dalle più inutili discussioni fatte di bestialità e leggende metropolitane su forum e newsgroup, fino a ultra-accademici paper che discutono le minuzie dando per scontato tutto il resto. Quelle che seguono sono risorse che tentano di fare un po' d'ordine. Richard Jones, Rafael D Lins Garbage Collection: Algorithms for Automatic Dynamic Memory Management.
Un libro eccellente, che copre la storia del memory management dall'inizio a oggi, i vari sistemi di reference counting, gli algortmi di marcatura e di copia, fino ad arrivare agli approcci più attuali come i sistemi concorrenti e distribuiti, gli algoritmi incrementali e i GC "ibridi". Contiene anche due capitoli specificamente dedicati a C e C++. Un "must", con l'unico difetto di un prezzo di copertina un po' alto. A garbage collector for C and C++ Il sito di riferimento sul BDW-GC, con le varie versioni da scaricare, tantissime informazioni generali e mirate, e non solo. Hans Boehm ha posto alcune delle pietre miliari nella storia della Garbage Collection, e il sito riporta diversi paper e presentazioni sulla teoria, elenchi di falsi miti da sfatare, e analisi comparative fra le politiche seguite dai vari garbage collector.The memory management reference Come dice già il nome, è un ottimo punto di riferimento per quanto riguarda il mondo del memory management: contiene un nutrito glossario di più di quattrocento termini, una buona FAQ, e una fin troppo vasta bibliografia, fortunatamente divisa per argomenti. Il libro "Inside the Java Virtual Machine" di Bill Venners è accompagnato, nel capitolo sulla garbage collection, da un'applet Java simpatica e decisamente strana, che illustra in modo chiaro (ma semplicistico) il meccanismo di mark'n sweep sulle risorse dello heap. Ah, dimenticavo: le "risorse"... sono dei pesci! C++ Answers From Bjarne Stroustrup Di tanto in tanto, su slashdot arrivano anche cose interessanti da leggere. Questa discussione, in cui Bjarne Stroustrup risponde a varie domande sul "suo" linguaggio, contiene, fra l'altro una parentesi sull'annosa questione: "perché il C++ non ha un GC standard?" |
||
| Sorgenti: | ||
|
Clicca qui per scaricare i sorgenti dell'articolo. |
||
| 111 | Febbraio 2007 | Programmiamo un leak detector |
|
I meccanismi di allocazione della memoria in C++ sono complessi e spesso sconosciuti agli stessi sviluppatori. Cos'è un placement delete? Come funziona un allocatore STL? Che succede se new lancia un'eccezione? Con la "scusa" di implementare un rudimentale leak detector, quest'articolo risponde a queste ed altre domande. |
||
| Note: | ||
|
Per colpa mia non è stato pubblicato un piccolo paragrafo/boxino di una certa importanza. Lo riporto qui di seguito: Scrivere ogni volta il nome del file e il numero di riga è un'impresa stressante e soprattutto inutile! I preprocessori aderenti allo standard forniscono automaticamente queste informazioni attraverso l'espansione delle macro __FILE__ e __LINE__. Ad esempio, è possibile scrivere: string* x = new(__FILE__, __LINE__) string; A ben guardare è possibile fare anche di più definendo una macro come questa: #define NEW new(__FILE__, __LINE__) Così facendo, l'inizializzazione via leak-detector assume questa forma: string* x = NEW string; A questo punto, a qualcuno potrebbe venire un'idea maliziosa ma geniale. Perché non evitare le chiamate "new" anonime ridefinendo completamente la parola chiave, scrivendo qualcosa di questo tipo? #define new NEW L'idea è interessante, ma in diversi casi la parola "new" ha un altro significato rispetto alla semplice chiamata, e ridefinirla potrebbe avere effetti disastrosi sul nostro codice. Le librerie esterne, inoltre, non sono tenute a conoscere il nostro leak detector, e potrebbero fallire la compilazione. [NOTA: Se non siete convinti e volete un esempio pratico, questo è abbastanza emblematico. La favola insegna che ridefinire il significato delle parole chiave del linguaggio è Male. Ricordate anche questo ai vostri bambini, già che ci siete.] Meglio non farci prendere dall'euforia e limitarci alla macro NEW. |
||
| Sorgenti: | ||
|
Clicca qui per scaricare i sorgenti dell'articolo. |
||
| 110 | Gennaio 2007 | Problemi di memoria e puntatori più intelligenti |
|
Auto_ptr e scoped_ptr si rivelano una scelta troppo limitata in molte applicazioni, in particolare non possono essere utilizzati nei contenitori e in condivisione.. Quest'articolo mostra come superare il problema grazie agli smart pointer std::shared_ptr e boost::intrusive_ptr. |
||
| 109 | Dicembre 2006 | Problemi di memoria e puntatori intelligenti |
|
Gestire manualmente la memoria porta spesso alla scrittura di programmi fragili e insicuri rispetto alle eccezioni. Quest'articolo mostra come superare il problema gestendo automaticamente la memoria, grazie agli smart pointer std::auto_ptr e boost::scoped_ptr. |
||
Copyright Roberto Allegra, 2006. All rights reserved.
I codici sorgenti sono presentati in via provvisoria per gentile concessione della Edizioni Master, che ne detiene ogni diritto.