Warum ist die Lebensdauer für slice :: from_raw_parts wichtig?

8

Die Dokumente für slice::from_raw_parts warnen den Programmierer, die Scheibe mit der korrekten Lebensdauer zu kommentieren. Ich nehme an, dass ich diese Annotation mit

ausführen kann, wenn ich eine Lebensdauer 'a habe %Vor%

Ich nehme das auch an

  • Da myslice eine Referenz ist, hat es nichts mit der Zuordnung / Freigabe der zugrunde liegenden Daten zu tun, auf die ptr verweist. Die lebenslange Annotation hat keinen Einfluss auf die Speicherverwaltung der Daten.
  • Es gibt nichts Schwieriges bei der Speicherverwaltung für myslice selbst (d. h. eine Struktur, die einen Zeiger und eine Größe enthält). Es ist wie jede andere Struktur oder i32 . Wenn ich es in ein Box setze, wird die std::raw::slice Struktur freigegeben, wenn die Box stirbt. Die Daten, auf die sich das Slice bezieht, werden natürlich nicht freigegeben. Die Lebensdauer hat keinen Einfluss auf die Speicherverwaltung für das Segment.

Warum ist es wichtig, dass die Lebensdauer korrekt ist? Ist die Verwendung nach der Freiheit die einzige Gefahr, die man befürchten muss, wenn man die Lebensdauer der Scheibe festlegt?

    
Jackson Loper 23.10.2015, 15:02
quelle

2 Antworten

9

Verwendung nach dem Gebrauch ist nicht die einzige Gefahr. Bei falscher Lebenszeit kann ein veränderliches Aliasing verursacht werden. Nehmen wir diese (erfundene) Funktion als Beispiel:

%Vor%

Aufgrund der Anordnung der Lebensdauern werden Aufrufe wie folgt erfolgreich sein:

%Vor%

Beachten Sie, dass in der Signatur dieser zweiten Funktion die Lebensdauern korrekt sind und Verwendung-nach-Frei ist keine (unmittelbare) Gefahr. Aber veränderliches Aliasing ist sehr heimtückisch. Grundsätzlich beruht alles auf der garantierten Abwesenheit von veränderlichem Aliasing, um Probleme wie Race Conditions, Iterator-Invalidierungen, logische Fehler und tatsächlich die Verwendung nach dem freien (von etwas verwaltetem T ) zu verhindern. Sie können fast jedes vorstellbare Problem mit veränderlichem Aliasing verursachen.

    
delnan 24.10.2015, 14:49
quelle
0

UPDATE: Wie bereits erwähnt, ist das veränderliche Aliasing ein echtes Problem, das sich aus dem Setzen einer falschen Lebensdauer ergeben kann. Siehe seine Antwort für weitere Details.

Alte Antwort

Die Verwendung nach dem Laden ist in der Tat die einzige Gefahr, die man befürchten muss, wenn man die Lebensdauer der Scheibe festlegt. Der Compiler wird Ihnen vertrauen und davon ausgehen, dass die Daten, auf die das Segment zeigt, so lange existieren, wie Sie die Lebensdauer angegeben haben. Falls Ihre annotierte Lebensdauer länger ist als die tatsächliche Lebensdauer der zugrunde liegenden Daten, können Sie möglicherweise mit "Nach-nach-Frei" -Fehlern fertig werden (Sie können das Segment verwenden, während die Daten bereits freigegeben wurden).

In Bezug auf Ihre Annahmen sind sie richtig. Lebenslange Annotationen haben keinen Einfluss auf die Speicherverwaltung der Daten.

    
aochagavia 23.10.2015 20:48
quelle

Tags und Links