私はしばらくの間、この小さな問題に苦労してきました。内部 JSON 構造の独自の実装を作成しようとしています。課題は、Ada ではアクセス タイプを使用して再帰的にする必要があり、厳密に制御しないとアクセス タイプがリークするリスクがあることです。それを制御するために、私は提供したすべての実際の活動を非公開にしGet (Source:...)
、Set (Target:...; Value:...)
既存の Vector (json-array) または Map (json-object) 要素を検証して処理しようとする Node タイプの関数/手順。Ada 2012 の安定した機能を使用し、コンテンツが範囲外になるとそれをキャッチしていることをさらに確認するために、Protected_Controlled タイプを使用して Ada ライブラリを「管理」しようとしましたが、コンテナ ライブラリが保護されたタイプを処理できないことがわかりました。ので、単純に Controlled を使用しました。このFinalize (...)
手順は、任意の Vector または Map タイプを対象としており、Node_Value.Reference を再帰的に解放します。
私の質問は、Ada 2012 を正しく適用しているかどうか、またはベクトル/マップまたは文字列/数値のいずれかであるタイプのメモリ管理再帰を作成するにはどうすればよいかということです。
private
...
type Node_Access is access Node;
type Node_Value is new Ada.Finalization.Controlled with record
Reference : Node_Access;
end record;
overriding procedure Initialize (Item : in out Node_Value);
overriding procedure Adjust (Item : in out Node_Value);
overriding procedure Finalize (Item : in out Node_Value);
...
package Of_Array is new Ada.Containers.Indefinite_Vectors (Natural, Node_Value);
package Of_Object is new Ada.Containers.Indefinite_Ordered_Maps (Wide_String, Node_Value);
type Node is record
...
Vector : aliased Of_Array.Vector;
Object : aliased Of_Object.Map;
end record
with Size => 96;
procedure Free is new Ada.Unchecked_Deallocation (Node, Node_Access);