2016-04-17 3 views
0

Lässt sich das folgende Szenario in der Einzel verlinkte Liste berücksichtigen: -Ausplanen Speicher auf ungenutzten Objekte forcelly

ich den Zielknoten gegeben wurden, die gelöscht werden soll.

Nehmen wir die folgenden Daten an und ich werde das Objekt erhalten, das "3" enthält, welches ich löschen werde;

1 -> 2 -> 3 -> 4 -> 5 -> 6

und Klassenstruktur ist: -

Class DataHolder 
{ 
int data; 
DataHolder nxtPrt; 
} 

Void Delete (DataHolder currentData) 
{ 

currentData.data = currentData.nxtPrt.data; //Now 3 will be overwritten by 4 
(x) currentData.nxtPrt = (y) currentData.nxtPrt.nxtPrt; 

//Now the object which belongs to 4 (previously it was 3), 
//is pointing to 5; 

} 

So, jetzt die eigentliche Kopie des Objekts 4 wird nun worden nutzlos;

Also, jetzt möchte ich nur den Platz auf der ursprünglichen Kopie von 4 zugeteilt entfernen;

Aber jetzt kann ich es nicht auch da verfolgen, habe ich das Objekt geändert zu Punkt 5.

So jetzt an dieser Stelle ich verloren habe das eigentliche Objekt 4.

Darf ich wissen, bitte , gibt es eine Möglichkeit, das Objekt zwangsweise zu bitten, seinen belegten Speicher freizugeben, wie in "C" mit dealloc, , oder ich muss mich auf den GC verlassen, um den ungenutzten Platz nach seinem Wunsch zu sammeln.

Vielen Dank im Voraus.

+1

Mehrere Dinge, die Sie nie tun sollten. Erzwinge keine Speicherbereinigung, schreibe keine eigene LinkedList-Klasse, verwende keine verknüpften Listen. Informieren Sie sich über ein einführendes Buch zur .NET-Programmierung in Ihrer lokalen Bibliothek, um zu vermeiden, dass Sie * jede * schlechte Praxis treffen. –

+2

@ ThomasAndreèLian: 'IDisposable' ist nützlich, um nicht gemanagte Ressourcen wie Dateihandles, Sockets usw. deterministisch freizugeben. Verwalteter Speicher wird vom Garbage Collector behandelt und steht nicht mit IDisposable in Verbindung.Wenn Sie etwas freigeben, wird kein verwalteter Speicher freigegeben. –

Antwort

2

Sie verlassen sich immer auf den GC, es gibt keinen Weg um ihn herum. Und ja, es wird Ihre anderen Objekte aufräumen, solange es keinen Bezug zu ihnen gibt. Sie können nicht verwalteten Speicher zuordnen und damit umgehen, wie Sie es für richtig halten, aber in diesem Fall, warum verwenden Sie C#? Verwenden Sie einfach C (++).

Aber die einfachste Antwort ist schreiben Sie nicht Ihre eigene verkettete Liste. Verwenden Sie einfach LinkedList<YourStruct>. Lernen Sie Ihre Umgebung - die Sprache (n), die Bibliotheken und die Laufzeitumgebung. Wenn Sie nur C-Code in C# schreiben, werden Sie weh tun, niemand wird Ihren Code verstehen und Sie profitieren kaum von der Arbeit in C#. Auch wenn Sie C# /. NET nicht verwenden möchten, tun Sie das nicht. Mit C oder C++ oder mit nicht verwalteten Sprachen ist nichts an sich falsch. Verwenden Sie das beste Werkzeug für den Job.

Denken Sie nicht in C-Bedingungen überhaupt. Es funktioniert einfach nicht in einer GC'd/verwalteten Umgebung. Woher kommt Speicher, wenn Sie ihn in C zuweisen? Normalerweise der Stapel oder der Haufen, mit ein paar Bits in Registern. In .NET ist das etwas abstrahiert, aber in der Praxis haben Sie nur diese drei Standorte. Sie arbeiten jedoch anders. Sie können keine Klassen oder Arrays auf einem Stack zuweisen (es gibt nur eingeschränkte Unterstützung mit unsicheren Code, aber das wars). Es gibt mehrere Haufen, und abgesehen von dem großen Objekt-Heap, immer von oben zuweisen, ähnlich einem Stapel. Das Freigeben eines einzelnen Objekts hat also keinerlei Wert. Wenn Sie den Heap nicht compact entfernen, um die freien Stellen zu beseitigen, erhalten Sie weniger Speicherbelegung und Sie erhalten keinen zusätzlichen Speicherplatz für neue Objekte.

+0

stimmt überein. Das Problem wird durch die Verwendung des Dekorationsmusters für eine 1-dimensionale Liste durch OP weiter kompliziert –

+0

@ S.W. Es ist nicht wirklich ein Dekorationsmuster. Es ist einfach so, wie Dinge in C gemacht werden - Datensätze und Funktionen :) – Luaan

Verwandte Themen