【发布时间】:2018-06-12 09:44:53
【问题描述】:
我正在阅读有关 Ada access types 的信息,据我了解,当没有人再指向它们时,您使用运算符 new 分配的 access types 对象被释放:
那么,Ada 中的访问类型是否与 C++ 中的 std::shared_ptr 完全一样? (除了C++没有的Ada指针相关的约束)
编辑
当我说std::shared_ptr 时,我的意思是当没有更多变量指向对象时,对象被释放。
【问题讨论】:
我正在阅读有关 Ada access types 的信息,据我了解,当没有人再指向它们时,您使用运算符 new 分配的 access types 对象被释放:
那么,Ada 中的访问类型是否与 C++ 中的 std::shared_ptr 完全一样? (除了C++没有的Ada指针相关的约束)
当我说std::shared_ptr 时,我的意思是当没有更多变量指向对象时,对象被释放。
【问题讨论】:
编译器被允许实现垃圾回收,但我不知道有任何编译器真正做到这一点(除了一些 GNAT 的自定义构建)。
您必须等待 C++ 程序员经过,才能与 C++ 中的std::shared_ptr 进行比较。
如果要确保分配在存储池(堆上)中的对象被释放,请使用Ada.Unchecked_Deallocation。
【讨论】:
不,Ada 指针(实际上)与 C/C++ 普通指针一样几乎不受管理。正如 Jacob 的回答所说,这是我在实践中没有看到的编译器实现选择。
我知道的区别是,对于局部范围的指针类型,当类型而不是指针类型时,您会从该类型的所有对象中获取内存,超出范围。但是这些指针很少有用(它们可以用于非常本地化的算法,但不适用于长期存在的结构)。
对于指针 a-la std::shared_ptr,您需要推出自己的实现或寻找一些 Ada 库(可能 GNATCOLL.Refcount 是匹配的)。
【讨论】: