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
'a
habe
%Vor%
Ich nehme das auch an
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. 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?
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.
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.
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.