I don't think that your example is adequate for the new feature you
advocate.
X.Ptr.all := Y.Ptr.all;
is a very dangerous statement, because X.Ptr may point to a too short
string.
Your example is about unbounded strings that are manually finalized.
I would write them as:
package SV is
type Vstr is limited private;
procedure Assign (To : in out Vstr; From : Vstr);
function Image (Source : Vstr) return String;
-- ...
private
type String access is access all String;
Null_String_Access : constant String_Access := new String'("");
type Vstr is record
Ptr : String_Access := Null_String_Access;
Len : Natural := 0;
end record;
end SV;
Unbounded_Strings are relatively slow in Ada, because they must be
implemented as controlled objects.
If the spec above is not adequate for your example, please tell us.
-- Vincent Celier