Yes. What you've written is exactly how to allocate an array of dynamic size on the heap. You can also do:
declare
My_Array: Foo_Array(X..Y);
begin
...
end;
Hmm, I remember it being very hard, but it seems I've lost the specifics. My bad. In any case, Ada is not a language I'm excited to work with, but Go could be one.