我试图找到一些关于为什么new可以使用关键字来动态分配对象的信息,但是没有像delete这样的关键字可以用来释放它们。经历的提到Ada.Unchecked_Deallocation在阿达2012参考手册,我发现了一些有趣的摘录:
每个对象在被销毁之前都已完成(例如,通过留下包含 object_declaration 的 subprogram_body,或通过调用 Unchecked_Deallocation 的实例)
每个访问对象类型都有一个关联的存储池。分配器分配的存储来自池;Unchecked_Deallocation 的实例将存储返回到池中。
在 Unchecked_Deallocation 实例的执行期间,用户定义的存储池对象 P 的解除分配过程可以被实现调用,以仅在允许对 P 进行分配调用的地方为池为 P 的类型 T 解除分配存储对于 T,或作为 T 集合最终确定的一部分。
如果我不得不猜测,这意味着当执行离开声明访问的范围时,实现有可能自动释放与访问关联的对象。无需显式调用.Unchecked_Deallocation
这似乎得到了Ada 95 质量和样式指南中的一个部分的支持,该部分指出:
未经检查的存储解除分配机制是一种覆盖回收已分配存储的默认时间的方法。最早的默认时间是对象不再可访问时,例如,当控制离开声明访问类型的范围时(此时间之后的确切时间点取决于实现)。如果尝试访问对象,则在此之前执行的任何未经检查的存储解除分配都可能导致错误的 Ada 程序。
但措辞相当不明确。如果我运行这段代码,内存方面到底会发生什么?
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
procedure Run is
X : access Integer := new Integer'(64);
begin
Put (Integer'Image (X.all));
end Run;
begin
for I in 1 .. …Run Code Online (Sandbox Code Playgroud) 我试图通过编写一组管理动态数组的过程来学习 Ada,但我不知道如何去做。在 C++ 中,我可以轻松地将任意对象放入内存中,如下所示:
#include <new>
#include <iostream>
class object {
private:
int value;
public:
~object() noexcept { std::cout << "<> "; }
object(int value) noexcept : value(value) { std::cout << object::value << ' '; }
};
constexpr auto size = 16;
int main() {
auto buffer = static_cast<object*>(::operator new(size * sizeof(object)));
for (auto offset = 0; offset < size; offset++)
new (buffer + offset) object(offset);
for (auto offset = 0; offset < size; offset++)
(buffer + offset)->~object();
::operator delete(buffer); …Run Code Online (Sandbox Code Playgroud)