2011-01-11 5 views
2

Was sind die Merkmale von C-Programmiersprache, die die Typ-Sicherheit zu brechen und verhindert, dass praktische Garbage Collection zur Sprache hinzugefügt werden? Erklären. Erstens verstehe ich nicht die Beziehung zwischen Typ-Sicherheit und Garbage Collection. Ich würde mich freuen, wenn mir jemand dabei helfen könnte.Beziehung zwischen Typ Sicherheit und Praxistauglichkeit von Garbage Collection

+0

Wie würde der Garbage Collector den Unterschied zwischen einem Zeiger auf ein Objekt und einem zufälligen Bit Speicher kennen, der zufällig denselben Wert hält? –

+0

Das ist genau der Punkt! Also die Lösung ist konservative Sammlung zu verwenden! – Moonwild

Antwort

1

Sie können tun Garbage Collection in C. Es heißt conservative garbage collection. Der Trick besteht darin, alle Daten, die wie ein Zeiger aussehen, so zu behandeln, als ob es tatsächlich ein Zeiger wäre, und keinen Speicher zurückzufordern, der durch ihn erreichbar ist. Es gibt zwei Probleme: Zum einen können Sie Daten nicht verschieben (dh Komprimierung), da die Ungewissheit, ob etwas, das wie ein Zeiger aussieht, tatsächlich ein Zeiger ist. Wenn Sie also auf einen neuen Speicherort zeigen, kann dies zu Datenkorruption führen). Das Typ-Sicherheitsproblem besteht darin, dass es für einen C-Programmierer möglich ist, einen Zeiger auf ein int zu speichern, eine Mathematik auszuführen und dann den Zeiger wiederherzustellen (wie in: ptrdiff_t d = (ptrdiff_t) ptr; ptr = NULL; d += 42; /* GC here would be bad */ d -= 42;). Dieses Verbergen des Zeigers könnte zu einem konservativen Müll führen collector, um Speicher, der nur über diesen Zeiger erreichbar war, vorzeitig zurückzugewinnen.

+0

Vielen Dank für die ausführliche Antwort. Erstens war es für mich nicht klar, da ich mich nicht an den Typ Casting erinnerte. – Moonwild

+0

Eigentlich ist die Situation noch schlimmer. Ein 100% legitimes C-Programm könnte wiederholt einen großen Teil des Speichers belegen und auffüllen, einen Zeiger darauf speichern in einer Union mit 'unsigned char [sizeof (void *)]', den Inhalt dieses Arrays ausgeben (wahrscheinlich in hex) die Konsole und überschreiben alle Spuren dieses Zeigers. Es könnte dann, nachdem es dies einige Male getan hat, eine Sequenz von Hexadezimalziffern akzeptieren, die zuvor erwähnte Vereinigung verwenden, um sie in einen Zeiger zurück zu konvertieren und den Inhalt des dadurch identifizierten Speichers anzuzeigen. Da der C-Standard erfordert, dass Zeiger solange gültig bleiben, wie ... – supercat

+0

... Daten, die ausreichen, um das zugrundeliegende 'char []' wieder herzustellen, * überall * gespeichert werden und es nicht einmal benötigt wird, * innerhalb des Computers * zu sein, es wäre in vielen Fällen unmöglich für eine C-Implementierung zu bestimmen, ob ein bestimmter Zeiger noch existiert (es könnte eine solche Bestimmung für Zeiger vornehmen, die niemals einem Aliasnamen für "unsigned char" zugeordnet wurden, aber dies würde GC für irgendeinen Zeiger ausschließen jemals "memcpy" ausgesetzt worden sein). – supercat

-1

Es gibt keine Beziehung zwischen Typ Sicherheit und Garbage Collection überhaupt. Zum Beispiel gibt es eine Sprache, die Ada genannt wird (heutzutage nicht sehr beliebt), die sehr typsicher ist, aber keinen Garbage Collector aufweist. Zur gleichen Zeit ist Javascript eine dynamische Sprache (d. H. Keine Typsicherheit überhaupt), hat aber in den meisten Implementierungen einen Garbage Collector.