Questa è una domanda molto semplice. Lo formulerò usando C++ e Java, ma è davvero indipendente dalla lingua. consideri un problema ben noto in C++:Garbage Collection vs gestione manuale della memoria
struct Obj
{
boost::shared_ptr<Obj> m_field;
};
{
boost::shared_ptr<Obj> obj1(new Obj);
boost::shared_ptr<Obj> obj2(new Obj);
obj1->m_field = obj2;
obj2->m_field = obj1;
}
Si tratta di una perdita di memoria, e lo sanno tutti :). La soluzione è anche nota: si dovrebbero usare i puntatori deboli per rompere il "blocco del conto alla rovescia". È anche noto che questo problema non può essere risolto automaticamente in linea di principio. È unicamente responsabilità del programmatore risolverlo.
Ma c'è una cosa positiva: un programmatore ha il pieno controllo sui valori degli account. Posso mettere in pausa il mio programma nel debugger ed esaminare il conto per obj1, obj2 e capire che c'è un problema. Posso anche impostare un punto di interruzione in distruttore di un oggetto e osservare un momento di distruzione (o scoprire che l'oggetto non è stato distrutto).
La mia domanda riguarda Java, C#, ActionScript e altre lingue "Garbage Collection". Potrei mancare qualcosa, ma a mio parere
- non farmi esaminare refcount di oggetti
- Non fatemi sapere quando l'oggetto viene distrutto (va bene, quando l'oggetto è esposto a GC)
Ho spesso sentito dire che questi linguaggi non consentono a un programmatore di perdere una memoria ed è per questo che sono fantastici. Per quanto ho capito, nascondono solo problemi di gestione della memoria e rendono difficile risolverli.
Infine, le domande stesse:
Java:
public class Obj
{
public Obj m_field;
}
{
Obj obj1 = new Obj();
Obj obj2 = new Obj();
obj1.m_field = obj2;
obj2.m_field = obj1;
}
- E 'perdita di memoria?
- Se sì: come faccio a rilevare e risolvere il problema?
- Se no: perché?
Non è una perdita di memoria. Non ** ti protegge da perdite di memoria, ma non c'è nulla che ti impedisca di rilasciare quegli oggetti nel distruttore. La gestione della memoria fa parte del ** design dell'applicazione **; gli hack di basso livello non compenseranno la mancanza di design. –
non consentire a un programmatore di perdere una memoria, non è il caso, ma questi linguaggi potrebbero proteggerti dalla perdita di memoria nella maggior parte dei casi.Questo è un grande vantaggio per quei programmatori che non hanno alcuna idea della memoria, abbiamo almeno non devi preoccuparti troppo della perdita di memoria quando assegni loro alcuni piccoli progetti – StereoMatching
Non c'è accesso ai refcounts perché la maggior parte delle implementazioni non gestisce i refcounts, e le lingue in generale fanno attenzione a non imporre restrizioni su più dettagli di implementazione di quanto assolutamente necessario (come questo impedisce migliori implementazioni - più veloce, più robusto, più utile, ecc.). – delnan