People keep repeating Ada 83 features, as if nothing has changed.
Ada has free() via "Unchecked_Dealocation", which since Ada 95 is hardly directly called, beacause the language introduced support for RAII via controlled types.
Many data types like strings and vectors are capable of dynamic managing memory themselves, thus no need for the malloc()/free() dance like in C.
When stack allocations, or other kinds of allocations fail from those dynamic types, an exception is thrown, that can be caught and the same operation retried with smaller sizes.
With SPARK integration into standard Ada, formal proofs can be used to handle how memory and other resources are being managed.
Finally, due to Rust's sucess bringing affine types into the mainstream, Ada is also having a go into affine types, influenced by ParaSail experiment whose author now works at AdaCore (not to forget the remaining 6 Ada vendors still in business).
Ada has free() via "Unchecked_Dealocation", which since Ada 95 is hardly directly called, beacause the language introduced support for RAII via controlled types.
Many data types like strings and vectors are capable of dynamic managing memory themselves, thus no need for the malloc()/free() dance like in C.
When stack allocations, or other kinds of allocations fail from those dynamic types, an exception is thrown, that can be caught and the same operation retried with smaller sizes.
With SPARK integration into standard Ada, formal proofs can be used to handle how memory and other resources are being managed.
Finally, due to Rust's sucess bringing affine types into the mainstream, Ada is also having a go into affine types, influenced by ParaSail experiment whose author now works at AdaCore (not to forget the remaining 6 Ada vendors still in business).